gpt4 book ai didi

django - 如何使用 Django REST 框架将 JWT token 存储在数据库中

转载 作者:行者123 更新时间:2023-12-04 16:30:29 24 4
gpt4 key购买 nike

我们在 Django REST 框架中使用 JWT token 。在哪里存储 JWT token ,我想在我的数据库中存储 JWT token 。因为我在移动应用中使用了这个 API。

这里创建 JWT Token

class LoginView(APIView):
permission_classes = [permissions.AllowAny]

def post(self, request, format=None):
"""
Return a Valid token if username and password
is valid for a given client
"""
try:
username = request.data['username']
password = request.data['password']
user = authenticate(username=user.username, password=password)
if user is not None:
if user.is_active:
login(request, user)
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)

ind = Individual.objects.filter(user_id=user.id).first()
ind.login_flag = True
ind.save()

在这里,我使用了 JWT token 验证

class LogoutView(APIView):
permission_classes = (IsAuthenticated, )
authentication_classes = (JSONWebTokenAuthentication, )

def post(self, request, format=None):
.......
.......

它与 postman 上的 JWT token 验证一起正常工作。但我想在哪里存储 token 以及如何在我的数据库中存储 JWT token 。

最佳答案

正如该线程中的其他人已经建议的那样,重点是不要将 JWT 存储在您的数据库中。它用于无状态身份验证。您应该能够使用 secret 生成和检索 token 。

在 Django 中实现此目的的一种方法是使用 SECRET_KEY 对 JWT 中的数据进行编码和解码,例如:

import jwt

from django.conf import settings
from django.contrib.auth import get_user_model
from your_project import custom_exceptions as exc


def get_token_for_user(user, scope):
"""
Generate a new signed token containing
a specified user limited for a scope (identified as a string).
"""
data = {
"user_%s_id" % (scope): str(user.id),
}
return jwt.encode(data, settings.SECRET_KEY).decode()


def get_user_for_token(token, scope):
"""
Given a selfcontained token and a scope try to parse and
unsign it.

If max_age is specified it checks token expiration.

If token passes a validation, returns
a user instance corresponding with user_id stored
in the incoming token.
"""
try:
data = jwt.decode(token, settings.SECRET_KEY)
except jwt.DecodeError:
raise exc.NotAuthenticated("Invalid token")

model_cls = get_user_model()

try:
user = model_cls.objects.get(pk=data["user_%s_id" % (scope)])
except (model_cls.DoesNotExist, KeyError):
raise exc.NotAuthenticated("Invalid token")
else:
return user

函数 get_token_for_user 会将 token 的 user_idscope 绑定(bind)在一起,并使用 key 对其进行编码。如果 SECRET_KEY 已知,人们可能只能对其进行解码。

get_token_for_userget_user_for_token 是您从 HTTP_AUTHORIZATION header 中获取 token 后可以使用的实用函数,用于验证 token 是否成功已解码且有效。

这些实用函数还支持您创建的每个 token 的范围。因此,例如,您可以说这个特定的 token 仅用于 authentication 并将范围称为 authentication

这些实用函数接受的scope参数只是一个字符串,所以你可以使用你能想到的任何范围,并且在为特定的API调用解码它时,你知道 token 的范围应该在.

您可以根据需要修改这些以支持 JWT 进行身份验证。

关于django - 如何使用 Django REST 框架将 JWT token 存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47407536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com