Diese Antwort ist identisch mit diese Antwort von Mike y Jeffs Antwort beide Sätze redirect_uri
a postmessage
auf der Client-Seite. Ich möchte mehr über die Serverseite hinzufügen, und auch die besonderen Umstände, die für diese Konfiguration gelten.
Technischer Stapel
Backend
Frontend
Der "Code"-Fluss (speziell für Google OAuth2)
Zusammenfassung: React --> request social auth "code" --> request jwt token, um den "login"-Status in Bezug auf Ihren eigenen Backend-Server/Datenbank zu erhalten.
- Frontend (React) verwendet eine "Google-Anmeldeschaltfläche" mit
responseType="code"
um einen Autorisierungscode zu erhalten. (Es ist nicht Token, nicht Zugriffstoken!)
- Die Google-Anmeldeschaltfläche ist von
react-google-login
oben erwähnt.
- Wenn Sie auf die Schaltfläche klicken, öffnet sich ein Popup-Fenster, in dem der Benutzer ein Konto auswählen kann. Nachdem der Benutzer ein Konto ausgewählt und das Fenster geschlossen hat, erhalten Sie den Code aus der Callback-Funktion der Schaltfläche.
- Das Frontend sendet dies an den JWT-Endpunkt des Backend-Servers.
- POST-Anfrage, mit
{ "provider": "google-oauth2", "code": "your retrieved code here", "redirect_uri": "postmessage" }
- Für meinen Django-Server verwende ich Django REST Framework JWT + Django REST Social Auth. Django empfängt den Code vom Frontend und verifiziert ihn mit dem Google-Dienst (für Sie erledigt). Sobald er verifiziert ist, sendet er den JWT (das Token) zurück an das Frontend. Das Frontend kann nun das Token auslesen und irgendwo speichern.
- Alle von
REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI
, REST_SOCIAL_DOMAIN_FROM_ORIGIN
y REST_SOCIAL_OAUTH_REDIRECT_URI
in Djangos settings.py
sind unnötig . (Sie sind Konstanten, die von Django REST Social Auth verwendet werden) Kurz gesagt, Sie müssen in Django nichts einrichten, was mit der Umleitungsurl zusammenhängt . Die "redirect_uri": "postmessage"
im React-Frontend ausreichen. Das macht Sinn, weil die Social-Authentifizierungsarbeit, die Sie auf Ihrer Seite machen müssen, eine POST-Anfrage im Ajax-Stil im Frontend ist, ohne dass ein Formular eingereicht wird, so dass standardmäßig keine Umleitung stattfindet. Das ist der Grund, warum die Umleitungsurl nutzlos wird, wenn Sie den Code + JWT-Flow verwenden, und die serverseitige Umleitungsurl-Einstellung hat keine Wirkung.
- Die Django REST Social Auth übernimmt die Erstellung von Konten. Das bedeutet, dass es die E-Mail und den Nachnamen des Google-Kontos überprüft und feststellt, ob sie mit einem Konto in der Datenbank übereinstimmen. Wenn nicht, wird es ein Konto für Sie erstellen, mit der genauen E-Mail und Nachname. Der Benutzername wird aber etwa so lauten
youremailprefix717e248c5b924d60
wenn Ihre E-Mail lautet youremailprefix@example.com
. Es fügt eine zufällige Zeichenfolge an, um einen eindeutigen Benutzernamen zu erstellen. Dies ist das Standardverhalten, ich glaube, Sie können es anpassen und sich in der Dokumentation umsehen.
- Das Frontend speichert dieses Token und wenn es CRUD mit dem Backend-Server durchführen muss, insbesondere Erstellen/Löschen/Aktualisieren, wenn Sie das Token in Ihrem
Authorization
Header und senden Sie die Anfrage an das Backend. Das Django-Backend erkennt nun, dass es sich um einen Login handelt, d.h. um einen authentifizierten Benutzer. Wenn Ihr Token abläuft, müssen Sie es natürlich durch eine weitere Anfrage aktualisieren.
Ach du meine Güte, ich habe mehr als 6 Stunden damit verbracht und es endlich geschafft! Ich glaube, das ist das 1. Mal, dass ich das gesehen habe postmessage
Sache. Jeder, der an einem Django + DRF + JWT + Social Auth + React
Die Kombination wird auf jeden Fall einschlagen. Ich kann nicht glauben, dass keiner der Artikel da draußen erwähnt dies außer Antworten hier. Aber ich hoffe wirklich, dass dieser Beitrag können Sie Tonnen von Zeit sparen, wenn Sie die Django + React-Stack verwenden.