Django Allauth 65.2.0 безголовый режим - проблемы с токеном сессии

У меня есть установка с django, drf, django-allauth headless и nextjs, действующий в некотором роде как прокси для моего django api, полностью разделенный и серверный с разных серверов (обычная установка django и отдельный сервер node для next)

Настройки:

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,
    }
}

URLs: (изменения сделаны исключительно для эстетики)

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")),
]

Я хочу использовать режим headless, поскольку мне не нужны CSRF-функции браузерной реализации django allauth, однако я хочу использовать рукопожатие django-allauth, поэтому я отправляю post-запрос к api через форму из nextjs.

для этого примера рассмотрим мой домен как localhost

<form method="post" action="https://api.localhost/v1/user/auth/provider/redirect" className="w-full">
  <Button variant="outline" className="gap-2 w-full" type="submit">
    <Icons.LogIn />
    <span>Sign Up With Google</span>
  </Button>
  <Input type="hidden" name="callback_url" value="https://auth.localhost/accounts/google/login/callback/" />
  <Input type="hidden" name="process" value="login" />
  <Input type="hidden" name="provider" value="google" />
</form>

При этом форма успешно перенаправляется в google для авторизации моего приложения, и я могу авторизоваться с помощью scope из моих настроек и продолжить работу с моим приложением. Но в этот момент django allauth возвращает ответ об ошибке - насколько я понимаю, потому что у меня нет идентификатора/ключа сессии.

В allauth.socialaccout.providers.oauth2.views.OAuth2CallbackView.dispatch вызов allauth.socialaccout.providers.oauth2.views.OAuth2CallbackView._get_state возвращает этот ответ об ошибке, потому что в _get_sate состояние всегда None. Это то, как далеко я смог отследить это, я пытался выяснить, как получить session_token, чтобы поместить его в заголовок X-Session-Token, но поскольку handshake является редиректом от google к моему приложению, я не могу изменить заголовок, Поскольку я использую версию APP, а не BROWSER, у меня нет cookie (В небраузерном приложении у вас все равно не будет этого, а конечная точка provider_token все еще требует его согласно docs)

Теперь мой вопрос: если я прав и мне нужна сессия каким-то образом, как я могу идентифицировать сессию в django, чтобы state = statekit.unstash_state(request, state_id) действительно вернул правильное состояние? Или, если я не прав и есть что-то еще, что не так, то что именно?

Вернуться на верх