Настройки:
Код: Выделить всё
AUTH_USER_MODEL = "user.User"
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.ModelBackend",
"allauth.account.auth_backends.AuthenticationBackend",
]
HEADLESS_ONLY = True
HEADLESS_FRONTEND_URLS = {}
# HEADLESS_TOKEN_STRATEGY = "apps.core.backends.allauth_token_strategy.DRFTokenAndAnonSessionTokenStrategy"
SOCIALACCOUNT_PROVIDERS = {
"google": {
"APP": {
"client_id": config.OAUTH.GOOGLE.CLIENT_ID,
"secret": config.OAUTH.GOOGLE.CLIENT_SECRET,
},
"SCOPE": [
"profile",
"email",
],
"AUTH_PARAMS": {
"access_type": "offline",
},
"OAUTH_PKCE_ENABLED": True,
}
}
Код: Выделить всё
from allauth.headless.constants import Client
from allauth.headless.urls import build_urlpatterns
from django.urls import path, include
from django.urls.resolvers import RoutePattern
def build_allauth_url_patterns():
path_object = build_urlpatterns(Client.APP)[0]
path_object.pattern = RoutePattern("")
return [path_object]
urlpatterns = [
path("user/", include((build_allauth_url_patterns(), "headless"), namespace="app")),
path("accounts/", include("allauth.urls")),
]
для этого примера рассмотрим мой домен как локальный хост
Код: Выделить всё
Sign Up With Google
В allauth.socialaccout.providers.oauth2.views. OAuth2CallbackView.dispatch вызов allauth.socialaccout.providers.oauth2.views.OAuth2CallbackView._get_state возвращает этот ответ об ошибке, поскольку в _get_sate состояние всегда равно None. Вот насколько мне удалось это отследить. Я пытался выяснить, как получить session_token, чтобы поместить его в заголовок X-Session-Token, но поскольку рукопожатие — это перенаправление из Google в мое приложение, я не могу изменить заголовок, поскольку я использую версию ПРИЛОЖЕНИЯ, а не версию БРАУЗЕРА, у меня нет файла cookie (в приложении, отличном от браузера, его все равно не будет, а конечная точка поставщика_токена все еще требует его в соответствии с docs)
Теперь мой вопрос: если я прав и мне нужен сеанс каким-то образом, как я могу идентифицировать сеанс с помощью django, так что state = statekit. unstash_state(request, state_id) действительно возвращает правильное состояние? Или, если я ошибаюсь и что-то еще не так, что это?
Я копнул глубже и подтвердил, что проблема связана с сеансами, запрос, поступающий от Google, не имеет информация о сеансе, даже несмотря на то, что когда мы инициируем перенаправление поставщика, сеанс создается. Я не знаю почему, но кажется, что cookie-файла с идентификатором сеанса нет, хотя сеанс создан.
Подробнее здесь: https://stackoverflow.com/questions/792 ... n-problems