request.user.is_authenticated 返回 False,即使 `X-Session-Token` 标头是在 django-allauth (headless) {app} 中发送的

问题描述 投票:0回答:1

我使用 django-allauth (无头,{app})和 django-ninja 作为我的身份验证后端。我已经正确设置了 django-allauth 配置。如果我使用 POST http://127.0.0.1:8000/_allauth/app/v1/auth/login 并使用有效正文(用户名和密码)登录,它会成功响应会话令牌。按照文档中的说明,当我使用此令牌值设置 X-Session-Token 标头并将请求发送到 http://localhost:8000/_allauth/app/v1/auth/session (获取身份验证状态)时,它也会响应成功,json 正文包含 "meta": {"is_authenticated": true},这意味着用户已通过身份验证。

到目前为止,一切都很好并且身份验证工作正常。但是,当我点击另一个 api url(例如:GET http://localhost:8000/api/website/blog_category with header X-Session-Token: )时,我从该函数中发现 request.user 始终是 AnonymousUser 。我的理解是,由于 django-allauth 有自己的中间件,它应该正确填充 request.user,因为有效的 X-Session-Token 已作为标头正确发送。

她是我的 urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path("accounts/", include("allauth.urls")),
    path("_allauth/", include("allauth.headless.urls")),
    path("api/", api.urls),
] 

api.py:

from ninja import NinjaAPI

api = NinjaAPI()
api.add_router("website/", "website.api.router")

这是我的网站.api.py:

from ninja import Router
from ninja.security import django_auth # setting auth=django_auth, always returns permission denied
from typing import List
from .models import blog_category
from .schema import BlogCategoryRetrieveSchema

router = Router(auth=None) # since django-auth returns permission denied, so lets run without auth to print request.user & request.META.get('HTTP_X_SESSION_TOKEN')

@router.get("/blog_category", response=List[BlogCategoryRetrieveSchema])
async def blog_category_retrieve(request):
    print(request.user)
    print(request.META.get('HTTP_X_SESSION_TOKEN'))
    # logic here
    return something

控制台说:

AnonymousUser  # for print(request.user)
8jdtkzt69n9xp2xlqf9r6hc1eyw78p0k  # for print(request.META.get('HTTP_X_SESSION_TOKEN'))

意思是,会话令牌已正确发送,但 django-allauth 未对用户进行身份验证。 django-allauth 不应该从中间件自动完成它吗?还是我错过了什么?

我期望 django-allauth 的中间件能够负责对用户进行身份验证,并在每个请求中发送有效的 x-session-token 时填充 request.user。不过,allauth 的 api url(无头,{app})运行良好;当请求其他网址时,我没有看到任何身份验证,将 request.user 保留为 AnonymousUser。我试过:

from ninja.security import django_auth

router = Router(auth=django_auth)
# But setting auth=django_auth, always returns permission denied

现在,我可以编写一个中间件或者一个函数,使用“django-allauth”中的“获取身份验证状态”功能来验证用户并使用此机制来设置“auth”(忍者)。但是没有任何通用的方法可以做到这一点吗?我是不是错过了什么?

authentication django-allauth django-middleware django-request django-ninja
1个回答
0
投票

嗨,这可能是一个与我类似的问题。修复已创建。这是 github 问题 https://github.com/pennersr/django-allauth/issues/3981.

© www.soinside.com 2019 - 2024. All rights reserved.