Editor php, Xiaoxin, akan memperkenalkan kepada anda ralat CORS dalam Golang dan Gin selepas ubah hala. CORS (Cross-Origin Resource Sharing) ialah mekanisme untuk pemindahan data selamat antara domain yang berbeza, namun, menghadapi ralat CORS adalah masalah biasa apabila menggunakan rangka kerja Golang dan Gin. Artikel ini akan menerangkan secara terperinci punca dan penyelesaian ralat CORS untuk membantu pembangun lebih memahami dan menangani masalah ini. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini boleh memberi anda panduan dan penyelesaian yang berguna. Mari kita terokai ralat CORS dalam Golang dan Gin bersama-sama!
Saya cuba melaksanakan google oauth2 dalam pelayan web yang ditulis dalam go dan gin. Saya menambahkan dua titik akhir baharu bernama /google/log masuk dan /google/callback. Yang pertama menerima permintaan dan mengubah hala ke url auth google dan yang kedua dipanggil selepas pengguna memilih akaun google yang sah, mengesahkan token dan mencipta jwt untuk pengesahan dalaman saya.
Semuanya baik-baik saja, tetapi tidak demikian kerana apabila saya memanggil laluan api pertama saya mendapat ralat cors:
access to xmlhttprequest at 'https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=xxxxxxxxxxxxx-337ka657nqlo84q6697vv2efsc2vqvm0.apps.googleusercontent.com&redirect_uri=http%3a%2f%2flocalhost%3a3000%2fgoogle%2fcallback&response_type=code&scope=https%3a%2f%2fwww.googleapis.com%2fauth%2fuserinfo.email+https%3a%2f%2fwww.googleapis.com%2fauth%2fuserinfo.profile&state=7e5f86fe352b4563c7d1bd62408285dcbc44e3e26a4f142bbae915279008ece6' (redirected from 'http://localhost:3000/google/sign-in') from origin 'http://localhost:4200' has been blocked by cors policy: response to preflight request doesn't pass access control check: no 'access-control-allow-origin' header is present on the requested resource.
Ini kod golang saya:
r := gin.default() r.use(cors.new(cors.config{ alloworigins: []string{"*"}, allowmethods: []string{"get", "post", "put", "delete", "patch", "options"}, allowheaders: []string{"origin", "authorization", "content-type", "content-length", "accept-encoding", "x-csrf-token", "baggage", "sentry-trace", "x-user-lang"}, })) r.post("/google/sign-in", authcontroller.redirecttogoogleauthpage) r.get("/google/callback", authcontroller.googlesignin)
Pengawal Pengesahan
func (a AuthController) RedirectToGoogleAuthPage(c *gin.Context) { googleAuthConfig := utils.GetGoogleAuthConfig() state := utils.GenerateRandomKey() url := googleAuthConfig.AuthCodeURL(state, oauth2.AccessTypeOnline) session := sessions.Default(c) session.Set(state, state) err := session.Save() if err != nil { c.JSON(http.StatusInternalServerError, a.Errors.InternalError(err.Error())) return } c.Header("X-Auth-State", state) c.Redirect(http.StatusTemporaryRedirect, url) }
Dalam googleauthconfig, url panggil balik ialah http://localhost:3000/google/callback, yang ditambahkan pada bukti kelayakan oauth google cloud.
Saya tahu saya kehilangan access-control-allow-origin dalam permintaan panggil balik, tetapi bagaimana cara saya menambah pengepala itu?
Berdasarkan maklumat dalam soalan, anda sedang melawat http://localhost:4200
页面,并向http://localhost:3000/google/sign-in
发送AJAX请求,该请求将重定向到https://accounts.google.com/o/oauth2/auth
。这行不通。您需要将页面重定向到 https://accounts.google.com/o/oauth2/auth
.
Ada dua pilihan untuk menyelesaikan masalah ini:
Ubah suai kod pelanggan untuk menggantikan permintaan AJAX dengan permintaan borang (menggunakan <form action="http://localhost:3000/google/sign-in" method="POST">
元素)。在这种情况下,RedirectToGoogleAuthPage
中的 c.JSON
harus diganti dengan yang lain.
atau ubah suai RedirectToGoogleAuthPage
以使用包含要重定向到的目标 URL 的 JSON 内容进行响应,并修改客户端代码以将页面重定向到目标 URL(使用 window.location = targetURL
).
Nampaknya pilihan kedua memerlukan kurang perubahan pada kod.
Atas ialah kandungan terperinci Ralat CORS dalam Golang lwn Gin selepas ubah hala. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!