【问题标题】:Django username/password and api key JWT authenticationsDjango 用户名/密码和 api 密钥 JWT 身份验证
【发布时间】:2019-03-15 12:31:10
【问题描述】:

我有一些要求,我需要能够使用 username/passwordapi_key 对用户进行身份验证,并为这两种情况返回 JWT 令牌。

我使用用户名/密码的方法:

 if request.data['email'] and request.data['password']:
            try:
                user = User.objects.get(email=request.data['email'])
            except User.DoesNotExist:
                return Response({'Error': "Invalid username."}, status=status.HTTP_400_BAD_REQUEST)

            if user:
                if user.check_password(request.data['password']):
                    payload = jwt_payload_handler(user)
                    token = jwt_encode_handler(payload)

                    exp = datetime.now() + api_settings.JWT_EXPIRATION_DELTA
                    return Response({'token': token,
                                     'exp': format(exp, 'U')},
                                    status=status.HTTP_200_OK)
                else:
                    return Response({'Error': "Invalid password."}, status=status.HTTP_400_BAD_REQUEST)

jwt_payload_handler 的实现方式为:

def jwt_payload_handler(user):
 payload = {
        "id": user.id,
        "date": get_user_join_date(user),
        "username": user.username,  }
 return payload

我的一个问题是关键字用户名是否需要在有效负载中才能使令牌有效

考虑到密钥与用户无关,在 api_key 的情况下,什么是好的方法?

如果提供的 api_key 正确,我应该创建一个将在有效负载中使用的默认用户吗?

有什么建议吗?

【问题讨论】:

    标签: django django-rest-framework django-rest-framework-jwt


    【解决方案1】:

    是的,您可以创建一个默认用户来使用 API 密钥。当然,这意味着数据在使用该 API 密钥的每个人之间共享,这在您的用例中可能没问题。

    请注意,仅使用一个 API 密钥存在安全隐患。如果 API 密钥被泄露,您需要向 API 的每个用户发送一个新密钥。考虑creating a separate API token for each consumer of your API,就像每个消费者都有自己的用户名/密码一样。这样一来,如果消费者泄露了他们的 API 令牌,您只需为该特定消费者生成一个新令牌。

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2017-03-13
      • 2017-06-21
      • 2017-07-31
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2020-09-20
      • 2011-07-25
      相关资源
      最近更新 更多