Django username/password 和 api 密钥 JWT 身份验证
Django username/password and api key JWT authentications
我有一些要求,在这两种情况下,我需要能够使用 username/password
或 api_key
和 return JWT 令牌对用户进行身份验证。
我对 username/password 的处理方法:
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
我的一个问题是 关键字 username 是否需要在负载中才能使令牌有效?
在 api_key 考虑到密钥与用户无关的情况下,好的方法是什么?
鉴于提供的 api_key 是正确的,我是否应该创建一个将在负载中使用的默认用户?
有什么建议吗?
是的,您可以创建一个默认用户以使用 API 键。当然,这将意味着数据在使用该 API 密钥的每个人之间共享,这在您的用例中可能没问题。
请注意,仅使用一个 API 密钥存在安全隐患。如果 API 密钥被泄露,您将需要向 API 的每个用户发送一个新密钥。考虑 creating a separate API token for each consumer of your API,就像每个消费者都有自己的 username/password 一样。这样,如果消费者泄露了他们的 API 令牌,您只需为该特定消费者生成一个新令牌。
我有一些要求,在这两种情况下,我需要能够使用 username/password
或 api_key
和 return JWT 令牌对用户进行身份验证。
我对 username/password 的处理方法:
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
我的一个问题是 关键字 username 是否需要在负载中才能使令牌有效?
在 api_key 考虑到密钥与用户无关的情况下,好的方法是什么?
鉴于提供的 api_key 是正确的,我是否应该创建一个将在负载中使用的默认用户?
有什么建议吗?
是的,您可以创建一个默认用户以使用 API 键。当然,这将意味着数据在使用该 API 密钥的每个人之间共享,这在您的用例中可能没问题。
请注意,仅使用一个 API 密钥存在安全隐患。如果 API 密钥被泄露,您将需要向 API 的每个用户发送一个新密钥。考虑 creating a separate API token for each consumer of your API,就像每个消费者都有自己的 username/password 一样。这样,如果消费者泄露了他们的 API 令牌,您只需为该特定消费者生成一个新令牌。