如何使用Django REST framework实现管理员登录和注销?

How to implement admin login and logout using Django REST framework?

我接到了一项任务,以编程方式验证管理员登录和注销。

我可以登录,但是当我检查我正在注销的用户时,我会注销,它说 AnonymousUser。我怎样才能确保注销登录它的当前用户。

我正在使用 Django REST 框架并在 Postman 上对其进行测试。

@api_view(["POST"])
def adminLogin(request):
    
    if(request.method=="POST"):
        username = request.data["username"]
        password = request.data["password"]

        authenticated_user = authenticate(request,username=username, password=password)
        if authenticated_user != None:

            if(authenticated_user.is_authenticated and authenticated_user.is_superuser):
                login(request,authenticated_user)
                return JsonResponse({"Message":"User is Authenticated. "})   
            else:
                return JsonResponse({"message":"User is not authenticated. "})
        else:
            return JsonResponse({"Message":"Either User is not registered or password does not match"})

@api_view(["POST"])
def adminLogout(request):
    print(request.user)
    logout(request)
    return JsonResponse({"message":"LoggedOut"})

使用 REST API 登录 in/logging 没有多大意义。登录 in/logging 的想法,至少 Django 是如何实现它的,是通过会话的方式,因此使用具有会话 ID 的 cookie

API 像 Postman 这样的客户端通常 使用 cookie:每个请求都或多或少地独立于前一个请求。如果您因此在没有引用会话的情况下发出下一个请求,那么视图将不会 link 用户对该请求。在浏览器上运行的 AJAX 等客户端当然可以使用 cookie,因为它们嵌入在管理 cookie 的浏览器中。您可以按照 this tutorial [learning postman] 中指定的方式在邮递员中使用 cookie,但这通常不是 API 应该工作的方式。

这就是为什么 APIs 通常使用令牌,例如 JWT 令牌。进行身份验证时,会为它们提供一个可能在短时间内有效的令牌,随后它会使用该令牌发出任何其他应获得授权的请求。

正如 Django REST framework documentation on TokenAuthentication [drf-doc] 所说,您可以定义创建和撤销令牌的视图。该页面还讨论了 会话身份验证 ,因此可用于 AJAX 请求。

但是您可能因此使用了错误的方法来为您的 REST API 进行正确的身份验证,因此您可能想要使用像 JWT 令牌这样的令牌。