В документации django-rest-auth обсуждается интеграция с Facebook, которая меня не интересует - меня беспокоит обеспечение входа в социальные сети через Google. Я пробовал это довольно давно, и мне интересно, есть ли у кого-нибудь еще документация о том, как они это сделали ... даже простой набросок будет полезен. Пока что я не нашел результатов для этого поиска. Я почти готов, но не могу заставить его работать с API-интерфейсом для просмотра Django rest framework (DRF).
Вот что у меня есть до сих пор: я начал с демонстрационного проекта, представленного на странице github django-rest-auth, и изменил HTML-страницу шаблона входа в социальную сеть, чтобы требовать ввода только 'code', а не как 'code' И 'access_token' . Когда я предоставляю действительный код (полученный отдельным запросом к конечной точке аутентификации Google), это работает нормально; просматриваемый API отображает обычную веб-страницу с «ключом» (токен API моего приложения для пользователя) в ответе. Проверка администратора django, все работает - пользователь вошел в систему, электронная почта аутентифицирована и т.д. Пока все хорошо.
Проблема в том, что отправная точка предоставления «кода» - и как я получаю этот код из Google в первую очередь. Когда я ранее (успешно) использовал пакет allauth, я мог просто щелкнуть ссылку, которая «невидимо» выполняла бы весь поток OAuth2 (т.е. запрашивала код, использовала этот код для получения токена доступа и использовала токен доступа для получить информацию об учетной записи google пользователя).
Чтобы воссоздать этот непрерывный поток (т.е. НЕ начинать с кода), я решил, что могу прервать поток OAuth2 и «перехватить» код, возвращенный из Google, а затем отправить этот код по POST в API входа в социальную сеть rest-auth. С этой целью я создал собственный allauth.socialaccount.providers.oauth2.views.OAuth2CallbackView
, переопределив метод отправки:
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
Обычно этот метод вызывается, когда Google отправляет запрос GET на uri обратного вызова, который вы изначально предоставляете конечной точке аутентификации Google. С помощью этого переопределения я могу успешно проанализировать код, возвращаемый Google в этом обратном вызове. Запрос POST работает и имеет ключ пользователя в поле resp._content. Однако в конечном итоге он не может создать желаемое представление в доступном для просмотра API DRF.
Углубившись в стек вызовов, я обнаружил, что rest_framework.views.APIView.dispatch
возвращает объект типа rest_framework.response.Response
. Однако, когда использованный выше метод requests.post
завершается, он возвращает экземпляр типа requests.models.Response
. В результате он не имеет надлежащих атрибутов и не работает в промежуточном программном обеспечении django. Например, у него нет атрибута acceptable_renderer
и метода get (который используется в django.middleware.clickjacking.py
). Я мог бы, возможно, добавить эти требования к экземпляру requests.models.Response
(rp
), но тогда этот хак станет еще большим кладжем.
Спасибо за любую помощь, которую вы можете оказать!