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

How to be autheticated in Django backend when autheticated in ReactJs frontend?

我正在制作一个网络应用程序,使用 Django 3.2 (Python 9) 作为后端,使用 ReactJs 17 作为前端,中间使用 Graphene(GraphQL) API。 ReactJs 使用 Apollo Client Provider 3.4 来执行 API 查询和变更。

我正在使用 django-graphql-auth 包对我的用户进行身份验证,我将用户的身份验证令牌存储在浏览器的 localStorage 中,然后将其放入 Apollo Provider 的 headers。

在那之前一切正常。

现在,问题是用户应该可以通过单击前端的 link 来下载文件。 link 将重定向到后端 Django 视图,其中一个文件被放置在 HttpResponse 中。系统将提示用户接受下载文件。

但是,该文件是根据请求它的用户生成的(更准确地说是根据用户组生成的)。所以在我的 Django 视图中,我使用 request.user.groups 变量来生成可下载的文件。

问题出在这里:在后端,用户在前端进行身份验证时仍然是匿名的。

当用户登录前端时,如何在后端对用户进行身份验证? 我可以简单地将 request.user 值从 React 传递到 Django 的下载视图吗?如果是,那怎么可能?

在此先感谢您的帮助。

我找到了解决办法。

我只是将用户的 JWT 身份验证令牌包含在指向后端视图的 url 中。

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

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