django - 如何使用Django REST框架实现管理员登录和注销?

标签 django authentication django-rest-framework postman

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

我可以登录,但在注销时,当我检查要注销的用户时,它显示 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 登录/注销没有多大意义。登录/注销的想法,至少 Django 是如何实现的,是通过 session 来实现的,因此使用具有 session ID 的 cookie

像 Postman 这样的 API 客户端通常使用 cookie:每个请求或多或少都独立于前一个请求。如果您在不引用 session 的情况下发出下一个请求,则 View 将不会将用户链接到该请求。像 AJAX 这样在浏览器上运行的客户端当然可以使用 cookie,因为它们嵌入在管理 cookie 的浏览器中。您可以按照 this tutorial [learning postman] 中的指定在 postman 中使用 cookie。 ,但这通常不是 API 应该工作的方式。

这就是 API 通常使用 token (例如 JWT token )的原因。进行身份验证时,它们会获得一个可能在短时间内有效的 token ,随后它使用该 token 发出应授权的任何其他请求。

作为Django REST framework documentation on TokenAuthentication [drf-doc]也就是说,您可以定义创建和撤销 token 的 View 。该页面还讨论了可用于 AJAX 请求的 session 身份验证

但是您可能使用了错误的方法来对 REST API 进行正确的身份验证,因此您可能希望使用 JWT token 之类的 token 。

关于django - 如何使用Django REST框架实现管理员登录和注销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71495338/

相关文章:

python - 如何在 django 模板中循环遍历日期时间范围

python - 在 Django shell session 期间获取 SQL 查询计数

django - 让 Django super 用户在游戏化组件中定义新徽章

http - 如何使用 WinHttpRequest COM 进行登录?

python - Django Rest框架在POST请求中创建或更新

python - 在 Django REST framework 中,默认权限类如何与 per-view(set) 组合?

Django:如果在列表模板标签中

c# - 要求对 OWIN 应用程序的所有请求进行身份验证

c# - Asp.Net Core 3.1 Cookie 身份验证循环到登录页面

mysql - 如何在Django RF项目中使用UUID作为主键保留原始ID?