Der Herausgeber von PHP, Xiaoxin, wird Ihnen nach der Umleitung die CORS-Fehler in Golang und Gin vorstellen. CORS (Cross-Origin Resource Sharing) ist ein Mechanismus zur sicheren Datenübertragung zwischen verschiedenen Domänen. Allerdings ist das Auftreten von CORS-Fehlern ein häufiges Problem bei der Verwendung von Golang- und Gin-Frameworks. In diesem Artikel werden die Ursachen und Lösungen von CORS-Fehlern ausführlich erläutert, um Entwicklern zu helfen, dieses Problem besser zu verstehen und damit umzugehen. Egal, ob Sie Anfänger oder erfahrener Entwickler sind, dieser Artikel kann Ihnen nützliche Anleitungen und Lösungen bieten. Lassen Sie uns gemeinsam CORS-Fehler in Golang und Gin untersuchen!
Ich versuche, Google Oauth2 in einem in Go und Gin geschriebenen Webserver zu implementieren. Ich habe zwei neue Endpunkte mit den Namen /google/sign-in und /google/callback hinzugefügt. Der erste empfängt die Anfrage und leitet zur Google-Authentifizierungs-URL weiter und der zweite wird aufgerufen, nachdem der Benutzer ein gültiges Google-Konto ausgewählt, das Token überprüft und ein JWT für meine interne Authentifizierung erstellt hat.
Alles ist in Ordnung, aber das ist nicht der Fall, denn wenn ich die erste API-Route aufrufe, erhalte ich den Cors-Fehler:
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.
Das ist mein Golang-Code:
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)
Authentifizierungscontroller
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) }
In googleauthconfig lautet die Rückruf-URL http://localhost:3000/google/callback und wird den Google Cloud-OAuth-Anmeldeinformationen hinzugefügt.
Ich weiß, dass mir in der Rückrufanfrage „access-control-allow-origin“ fehlt, aber wie füge ich diesen Header hinzu?
Basierend auf den Informationen in der Frage besuchen Sie http://localhost:4200
页面,并向http://localhost:3000/google/sign-in
发送AJAX请求,该请求将重定向到https://accounts.google.com/o/oauth2/auth
。这行不通。您需要将页面重定向到 https://accounts.google.com/o/oauth2/auth
.
Es gibt zwei Möglichkeiten, dieses Problem zu lösen:
Ändern Sie den Client-Code, um AJAX-Anfragen durch Formularanfragen zu ersetzen (die Verwendung von <form action="http://localhost:3000/google/sign-in" method="POST">
元素)。在这种情况下,RedirectToGoogleAuthPage
中的 c.JSON
sollte durch etwas anderes ersetzt werden.
oder ändern RedirectToGoogleAuthPage
以使用包含要重定向到的目标 URL 的 JSON 内容进行响应,并修改客户端代码以将页面重定向到目标 URL(使用 window.location = targetURL
).
Sieht so aus, als ob die zweite Option weniger Änderungen am Code erfordert.
Das obige ist der detaillierte Inhalt vonCORS-Fehler in Golang vs. Gin nach der Umleitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!