我正在制作一个web应用程序,Django 3.2(Python 9(作为后端,ReactJs 17作为前端,中间有Graphene(GraphQL(API。ReactJs使用Apollo客户端提供程序3.4来执行API查询和突变。
我使用django-graphql-auth
包对用户进行身份验证,并将用户的身份验证令牌存储在浏览器的localStorage中,然后将其放入Apollo Provider的标头中。
在那之前一切都很好。
现在,问题是用户应该能够通过点击前端的链接来下载文件。此链接将重定向到后端Django视图,其中文件被放在HttpResponse
中。将提示用户接受下载该文件。
但是,文件是根据请求它的用户生成的(更准确地说是根据用户的组(。因此,在Django视图中,我使用request.user.groups
变量来生成可下载的文件。
问题是:在后端,用户在前端进行身份验证时仍然是匿名的。
当用户在前端登录时,我如何在后端对其进行身份验证?我可以简单地将React中的request.user
值传递给Django的下载视图吗?如果是,怎么可能?
提前感谢您的帮助。
我找到了一个解决方案。
我只是在指向后端视图的url中包含用户的JWT身份验证令牌。
# urls
from django.urls import path
from src import views
urlpatters = [
path("download/<str:user_auth_token>/", views.my_view),
]
然后,我在后台的Django视图从令牌的有效负载中获取用户。如果令牌无效,将引发错误。
from graphql_jwt.utils import get_payload, get_user_by_payload
from src.models import AppUser
def get_user_from_token(jwt_token: str) -> AppUser:
"""Get the user from the JWT token received from the frontend"""
return get_user_by_payload(get_payload(jwt_token))
因此,用户仍然没有在后端进行身份验证。我不是从request
获得用户,而是从令牌:获得用户
# view
from django.core.handlers.wsgi import WSGIRequest
def my_view(request: WSGIRequest, user_auth_token: str):
user = get_user_from_token(user_auth_token)
# Do something...
我只需要在一个视图中使用它,但我已经看到,与其通过url发送令牌,我还可以将其放在cookie中,并在后端创建一个中间件来读取它并从中获取用户。
如果您想在需要获取用户数据的地方使用多个后端视图,这可能很方便。