La documentazione di django-rest-auth parla dell'integrazione di Facebook, cosa a cui non sono interessato: la mia preoccupazione è fornire l'accesso social tramite Google. Ho provato questo per un po 'di tempo e mi chiedo se qualcun altro ha alcuna documentazione su come hanno fatto questo ... anche solo uno schizzo preliminare sarebbe utile. Finora, non ho trovato alcun risultato per questa ricerca. Sono quasi arrivato, ma non riesco a farlo funzionare con l'API navigabile Django rest framework (DRF).django-rest-auth: accesso social con google
Ecco quello che ho finora: Ho iniziato dal progetto demo in dotazione sulla pagina django-resto-auth github e modificato il modello di pagina HTML login sociale a richiedere solo l'ingresso 'codice', non sia il codice ' 'AND' access_token '. Quando fornisco un codice valido (ottenuto da una richiesta separata per l'endpoint auth di google), questo funziona correttamente; l'API navigabile esegue il rendering della solita pagina Web con la "chiave" (token API della mia applicazione per l'utente) nella risposta. Controllando l'amministratore di django, tutto ha funzionato: l'utente ha effettuato l'accesso, l'email è autenticata, ecc. Bene finora.
Il problema è che il punto di partenza di fornire il "codice" - e come ottengo quel codice da Google in primo luogo. Quando ho usato (con successo) il pacchetto allauth in precedenza, potevo semplicemente fare clic su un link, che avrebbe "invisibilmente" eseguito l'intero flusso OAuth2 (cioè richiedere il codice, utilizzare quel codice per ottenere il token di accesso e utilizzare il token di accesso per ottieni informazioni sull'account google dell'utente).
Per ricreare il flusso continuo (cioè NON iniziando con il codice), ho pensato che potevo interrompere il flusso di OAuth2 e "intercettare" il codice restituito da google e quindi postare quel codice all'API di login social resto-auth . A tal fine, ho creato una consuetudine allauth.socialaccount.providers.oauth2.views.OAuth2CallbackView
sovrascrivendo il metodo di spedizione:
class CustomOAuth2CallbackView(OAuth2CallbackView):
def dispatch(self, request):
# gets the code correctly:
code = request.GET['code']
# rp is of type requests.methods.Response
rp = requests.post(<REST-AUTH API ENDPOINT>, data = {'code':code})
return rp
Di solito, questo metodo viene chiamato quando Google invia una richiesta GET al uri richiamata inizialmente fornite al punto finale di autenticazione di Google. Con questo override, sono in grado di analizzare correttamente il codice restituito da google in tale callback. La richiesta POST funziona e ha la chiave dell'utente nel campo resp._content. Tuttavia, alla fine non riesce a produrre la vista desiderata nell'API navigabile DRF.
In base all'immersione nel blocco chiamate, trovo che rest_framework.views.APIView.dispatch
restituisce un oggetto di tipo rest_framework.response.Response
. Tuttavia, quando viene completato il metodo requests.post
sopra, viene restituita un'istanza di tipo requests.models.Response
. Di conseguenza, non ha gli attributi corretti e fallisce nel middleware django. Ad esempio, non ha alcun attributo acceptable_renderer
e nessun metodo 'get' (utilizzato in django.middleware.clickjacking.py
). Potrei, teoricamente, aggiungere questi requisiti all'istanza requests.models.Response
(rp
), ma poi questo hack diventa ancora più di un kludge.
Grazie per l'aiuto che puoi fornire!
hai preso da nessuna parte con questo? – jfunk
Purtroppo no. Sono stato occupato con altre cose e è caduto dal mio radar. Fortunatamente non era un elemento critico, ma sono sicuro che altri potrebbero essere interessati a questo. –