Dokumentacja django-rest-auth omawia integrację Facebooka, której nie jestem zainteresowany - moją troską jest zapewnienie logowania społecznościowego przez Google. Próbowałem tego już od jakiegoś czasu i zastanawiam się, czy ktoś jeszcze nie ma dokumentacji, jak to zrobili ... nawet pomocny byłby szkic. Do tej pory nie znalazłem żadnych wyników dla tego wyszukiwania. Już prawie jestem, ale nie mogę go uruchomić z interfejsem do przeglądania Django rest Framework (DRF).django-rest-auth: login społecznościowy z google
Oto co mam do tej pory: Zacząłem od projektu demo dostarczonej na stronie django-rest-auth github i zmodyfikowany szablon strony HTML logowania społecznego wymagają jedynie wejście „kodu”, a nie jak „Kod "AND" access_token ". Kiedy dostarczę poprawny kod (uzyskany przez oddzielne żądanie do google's auth punktu końcowego), to działa dobrze; przeglądalny interfejs API renderuje zwykłą stronę internetową za pomocą "klucza" (token API mojej aplikacji dla użytkownika) w odpowiedzi. Sprawdzanie administratora django, wszystko działało - użytkownik jest zalogowany, e-mail jest uwierzytelniony, itp. Dobre jak dotąd.
Kwestia polega na tym, że punktem wyjścia jest dostarczanie "kodu" - i jak ten kod jest pobierany z google. Kiedy poprzednio (z powodzeniem) korzystałem z pakietu allauth, mogłem po prostu kliknąć na link, który "niewidzialnie" wykonałby cały przepływ OAuth2 (tj. Zażądał kodu, użył tego kodu, aby uzyskać token dostępu, i użył tokena dostępu do uzyskać informacje o koncie Google użytkownika).
Aby odtworzyć ten płynny przepływ (tzn. NIE zaczynałem od kodu), doszedłem do wniosku, że mogę przerwać przepływ OAuth2 i "przechwycić" kod zwrócony z google, a następnie wysłać ten kod do interfejsu API społecznościowego z rest-auth . W tym celu stworzyłem zwyczaj allauth.socialaccount.providers.oauth2.views.OAuth2CallbackView
poprzez nadpisanie metody wysyłki:
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
Zazwyczaj ta metoda jest wywoływana, gdy google wysyła żądanie GET do URI zwrotnego początkowo dostarczyć do firmy google auth końcowego. Dzięki temu zastąpieniu mogę skutecznie przeanalizować kod zwrócony z google w tym wywołaniu zwrotnym. Żądanie POST działa i ma klucz użytkownika w polu resp._content. Ostatecznie jednak nie uda się uzyskać zamierzonego widoku w interfejsie API DRF do przeglądania.
Opierając się na nurkowaniu w stelażu, stwierdzam, że rest_framework.views.APIView.dispatch
zwraca obiekt typu rest_framework.response.Response
. Jednak po zakończeniu powyższej metody requests.post
zwraca ona instancję typu requests.models.Response
. W rezultacie nie ma odpowiednich atrybutów i nie działa w oprogramowaniu pośredniczącym django. Na przykład nie ma atrybutu acceptable_renderer
i nie ma metody "get" (która jest używana w django.middleware.clickjacking.py
). Mogłem, prawdopodobnie, dodać te wymagania do instancji requests.models.Response
(rp
), ale potem ten hack staje się jeszcze bardziej kludge.
Dzięki za pomoc, jaką możesz zapewnić!
dostałeś nigdzie z tym? – jfunk
Niestety nie. Zajęty innymi rzeczami i spadł z mojego radaru. Na szczęście nie był to element krytyczny, ale jestem pewien, że inni mogliby być tym zainteresowani. –