检测用户首次使用 Django Rest Framework 进行身份验证

Posted

技术标签:

【中文标题】检测用户首次使用 Django Rest Framework 进行身份验证【英文标题】:Detect first time user has authenticated using Django Rest Framework 【发布时间】:2017-04-13 01:28:24 【问题描述】:

我正在使用 DRF 来允许我的移动应用程序的用户对我的网络应用程序进行身份验证。

我想在用户第一次使用客户端“登录”时创建一个与该用户关联的模型实例。

我在 DRF 中使用基于令牌的身份验证,对于我的 /api/authenticate/ 端点,我指向 url(r'^authenticate/', restviews.obtain_auth_token),

似乎处理这个问题的最好方法是通过将这个类添加到我的 api/views.py 来覆盖获取AuthToken(APIView)。这个类看起来像这样:

class ObtainAuthTokenCustomized(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)
    serializer_class = AuthTokenSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response('token': token.key)


obtain_auth_token = ObtainAuthTokenCustomized.as_view()

看起来我想在 get_or_create 之前插入一个测试,以确定之前是否已为此用户创建了令牌。如果是这样,请执行我计划的模型实例创建。

有没有更好的方法来处理这个问题?

【问题讨论】:

【参考方案1】:

据我所知,这是处理此问题的最佳场所。

原因是 DRF 目前没有令牌过期功能。因此,一旦使用上述类创建了令牌,它就不会消失。

这意味着created 将在用户第一次登录时返回 True:

token, created = Token.objects.get_or_create(user=user)

因此,您只需在以下行测试 created 并执行模型创建或其他必要的操作。

如果令牌被删除,可能需要额外的逻辑来处理情况。例如,如果您使用创建了一种 API 注销方法,例如给定的in this answer。

【讨论】:

以上是关于检测用户首次使用 Django Rest Framework 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

首次成功调用 REST 后,未验证 HttpClient 上的凭据

如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?

Django rest 框架 jwt 令牌权限

使用 Django-rest-auth 创建新用户时创建自定义用户模型

Django 无法使用 rest-auth/user/ 获取当前用户

python 使用Django Rest Framework在Django中自定义用户实现