繁体   English   中英

如何在 Django 中使用令牌返回用户 ID?

[英]How can I return user ID with token in Django?

我在 Django 中使用默认视图生成令牌:

url(r'^login/', rest_auth_views.obtain_auth_token),

我有一个问题,因为我的前端不知道当前登录的用户 ID 是什么。

我应该用令牌返回它还是创建另一个请求?

我知道有很多不同的方法,但我想选择最优化的解决方案。

您可以覆盖rest_framework.authtoken.views.ObtainAuthToken.post以获得您想要的结果。

我的应用程序/views.py

from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response


class CustomObtainAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        response = super(CustomObtainAuthToken, self).post(request, *args, **kwargs)
        token = Token.objects.get(key=response.data['token'])
        return Response({'token': token.key, 'id': token.user_id})

myapp/urls.py

from django.conf.urls import url

from .views import CustomObtainAuthToken

urlpatterns = [
    url(r'^authenticate/', CustomObtainAuthToken.as_view()),
]

示例结果

$ http :8000/authenticate/ username=someuser password=secretpassword
HTTP/1.0 200 OK
Allow: POST, OPTIONS
Content-Language: en
Content-Type: application/json
Date: Tue, 22 Mar 2017 18:30:10 GMT
Server: WSGIServer/0.2 CPython/3.5.1
Vary: Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN

{
    "id": 16, 
    "token": "82e0bc9980a6b2c9a70969b0f8dc974418dda399"
}

这里的想法是覆盖ObtainAuthToken 视图类的post 方法。 在这里我所做的就是调用父类来获取令牌,然后查找该令牌以找到关联的用户 ID。

希望有帮助。

我认为最好的做法是在登录 api 的响应中返回用户详细信息。

如果您的 built_in 视图没有返回用户详细信息,您可以覆盖obtain_auth_token的 post 方法。 我曾经为 djangorestframework-jwt 获取令牌方法做过这个

def post(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)

    if serializer.is_valid():
        user = serializer.object.get('user') or request.user
        token = serializer.object.get('token')
        response_data = {
            'token': token,
            'user': UserSerializer(user).data
        }
        response = Response(response_data, status=status.HTTP_200_OK)
        if api_settings.JWT_AUTH_COOKIE:
            expiration = (datetime.utcnow() +
                          api_settings.JWT_EXPIRATION_DELTA)
            response.set_cookie(api_settings.JWT_AUTH_COOKIE,
                                response.data['token'],
                                expires=expiration,
                                httponly=True)
        return response

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

默认情况下, response_data dict 只有token详细信息,我还添加了用户对象以实现您要执行的操作。

如果您需要获取网页上的用户信息,则需要在 Login API 或其他 API 的响应中传递用户信息。

使用基于令牌的身份验证时,登录后会生成访问令牌和刷新令牌,这些令牌应在登录 API 响应中提供给客户端。 此访问令牌应在标头中传递为:

Authorization : Bearer <insert token here>

您需要将authentication_classes = [OAuth2Authentication]放在您的视图中。

这将验证用户是否已登录,您还可以通过user=request.user访问登录用户的信息。

我需要的不仅仅是带有令牌的用户 ID,所以我编写了代码来返回整个用户对象:

*我使用自定义用户,因此如果您使用的是 django 默认用户,请将模型和序列化程序更改为默认值。

from users.serializers import CustomUserSerializer
from users.models import CustomUser


class CustomObtainAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        response = super(CustomObtainAuthToken, self).post(request, *args, **kwargs)
        token = Token.objects.get(key=response.data['token'])
        user = CustomUser.objects.get(id=token.user_id)
        return Response({'token': token.key, 'user': CustomUserSerializer(user).data})

多亏了这个线程,这很容易! 希望我的回答也能节省别人的时间。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM