2017-01-20 6 views
2

Frage in Kürze: Anmeldung mit DRF, Python-Social-Auth und Angularjs arbeitet mit Facebook, aber nicht Google.Google-Authentifizierung mit Django-Rest-Framework und Python-Social-Auth

Ich baue eine Django-App, die es Benutzern ermöglichen soll, sich über Facebook und Google zusätzlich zur lokal gespeicherten E-Mail-/Passwort-Kombination anzumelden. Es funktioniert wie folgt:

  1. Für beide Anmeldungen und Einbuchen AngularJS initiiert FB und Google APIs (FB.init und gapi.auth2.init) mit ihren jeweiligen app_ids. Alle hierfür benötigten js-Bibliotheken sind in den Seiten enthalten.
  2. Basierend auf der Benutzerauswahl können sich Benutzer über Facebook oder Google anmelden oder ihre E-Mail/Passwort-Kombination eingeben.
  3. Alle erforderlichen Informationen einschließlich ihrer access_token wird über FB oder Googles API gesammelt.
  4. Wenn der Benutzer das Formular nach dem Ausfüllen aller relevanten Details abschickt (die Anmeldung erfordert die Eingabe zusätzlicher Daten), werden die Daten einschließlich access_token durch eine AJAX-Anfrage an den Server gesendet.
  5. Auf der Serverseite werden die Anfragen von den klassenbasierten Ansichten LoginView und SignUpView akzeptiert und verarbeitet. E-Mail-basierte Anmeldung/Anmeldung wird direkt durch den Code behandelt. Die Google/FB-basierte Anmeldung/Anmeldung wird an die do_auth-Funktion von python-social-auth zur Authentifizierung weitergeleitet.
  6. Wenn der Anbieter facebook ausgewählt ist, funktioniert das einwandfrei. Wenn es Google (versucht sowohl google-oauth2 und google-plus) ist, löst do_auth schließlich einen 403 Verbotenen Fehler. Wenn die zugehörige URL, https://googleapis.com/plus/v1/people/me?access_token=ACCESS_TOKEN&alt=json an den Browser kopiert wird, zeigt es eine Fehlermeldung:

Tageslimit für nicht authentifizierte Nutzung überschritten. Die fortgesetzte Nutzung erfordert Anmeldungen

  1. Ich habe dafür gesorgt, die folgenden Dinge:
    1. Aktiviert Google+ API in der Google-Entwickler-Konsole für die entsprechende App
    2. Von der Google Developer Console, hinzugefügt http://localhost:5001 zu Javascript-Ursprungsfeld und http://localhost:5001/social/complete Umleiten uri Feld (Späteres Feld wird später gefüllt. Das gleiche Ergebnis mit oder ohne.)
    3. Generierte Schlüssel und kopiert client_id und client_secret t o settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEY und settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET. Double hat ihre Genauigkeit überprüft.
    4. Hinzugefügt 'social.backends.google.GoogleOAuth2' zu settings.AUTHENTICATION_BACKENDS. Versucht, GoogleOAuth2 und GooglePlus zusammen und separat zu platzieren.
    5. Versucht alle diese in 2-3 mit PLUS auch anstelle von OAUTH2. Immer noch das gleiche Ergebnis.
    6. Nach der Einstellung erneut versucht, settings.SOCIAL_AUTH_USE_DEPRECATED_API als True. Dies scheitert auch, aber der Fehler ist jetzt 401.

Was auch diese Arbeit mit Google-Authentifizierung als nächstes zu tun bekommen? Durch viele andere ähnliche Fragen und Probleme in Github gegangen.

Hier ist der entsprechende Code:

class SignUpView(CreateAPIView): 

    def create(self, request, *args, **kwargs): 
     provider = request.data['provider'] 
     strategy = load_strategy(request) 
     backend = load_backend(strategy=strategy, name=provider, redirect_uri=None) 
     token = request.data['access_token'] 
     try: 
      user = backend.do_auth(token, user=None, **data) 
     except AuthAlreadyAssociated: 
      pass 
+0

Fand diese Antwort von @aragen relevant meine Frage: http://stackoverflow.com/a/28355531/7447662. Ich folge der gleichen Vorgehensweise wie deine. Irgendeine Idee dazu? –

Antwort

1

ich ähnliches Problem vor kurzem gekämpft habe, aber meine Situation war ein bisschen anders, weil ich django-Rest-Rahmen-sozial oauth2 verwenden.

Zunächst einmal habe ich bemerkt, Sie aktiviert Google+ API, aber:

Added 'social.backends.google.GoogleOAuth2' zu settings.AUTHENTICATION_BACKENDS.

Versuchen Sie, Ihre Einstellungen ändern (dies in python social auth docs beschrieben wird):

AUTHENTICATION_BACKENDS = (
... 
'social_core.backends.google.GooglePlusAuth', 
) 

SOCIAL_AUTH_GOOGLE_PLUS_KEY = '...' 
SOCIAL_AUTH_GOOGLE_PLUS_SECRET = '...' 

Eine andere Sache, die nützlich sein können für Sie google oauth playground ist

Verwandte Themen