我使用 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:
她是我的 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”(忍者)。但是没有任何通用的方法可以做到这一点吗?我是不是错过了什么?
嗨,这可能是一个与我类似的问题。修复已创建。这是 github 问题 https://github.com/pennersr/django-allauth/issues/3981.