当在ReactJs前端进行身份验证时,如何在Django后端进行身份验证



我正在制作一个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中,并在后端创建一个中间件来读取它并从中获取用户。

如果您想在需要获取用户数据的地方使用多个后端视图,这可能很方便。

最新更新