Django Rest Framework 中的 JWT 和自定义身份验证
JWT and custom authentication in Django Rest Framework
我已经编写了一个非常基本的自定义身份验证 class 以便为我的自定义身份验证需求实现简单的 JWT 库。
我generate tokens manually,然后将访问令牌发送到我的API。默认情况下,这就足够了,但由于我不使用默认的 Django 用户模型,我得到“找不到用户”。这是因为我需要实现自定义身份验证后端。
我需要读取该令牌以便使用给定的用户 ID 查询数据库并检查该令牌是否也有效。在我的例子中,我有固定的数字 2.
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
try:
user = vAuthUser.objects.get(pk=2) #this should receive the user_id from the token
except:
raise AuthenticationFailed('No such user')
return (user, None)
我的 API 看起来像:
class MyAPI(APIView):
authentication_classes = (ExampleAuthentication,)
permission_classes = (IsAuthenticated ,)
def get()...
试试这个:
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth.models import User
user = User.objects.first()
refresh = RefreshToken.for_user(user)
raw_token = str(refresh.access_token)
jwt_a = JWTAuthentication()
validated_token = jwt_a.get_validated_token(raw_token)
repr(validated_token)
print(validated_token["user_id"])
在这里,我将原始访问令牌提供给 JWTAuthentication class 的 get_validated_token()
方法。它 returns 一个包含这些键的字典:token_type
、jti
、user_id
、exp
以及它们的关联值。
我为我的示例使用了默认的 Django 用户模型,但它应该适用于您的自定义模型。
还有更多有用的方法,例如 get_header()
。也检查 this document and this one。
我已经编写了一个非常基本的自定义身份验证 class 以便为我的自定义身份验证需求实现简单的 JWT 库。
我generate tokens manually,然后将访问令牌发送到我的API。默认情况下,这就足够了,但由于我不使用默认的 Django 用户模型,我得到“找不到用户”。这是因为我需要实现自定义身份验证后端。
我需要读取该令牌以便使用给定的用户 ID 查询数据库并检查该令牌是否也有效。在我的例子中,我有固定的数字 2.
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
try:
user = vAuthUser.objects.get(pk=2) #this should receive the user_id from the token
except:
raise AuthenticationFailed('No such user')
return (user, None)
我的 API 看起来像:
class MyAPI(APIView):
authentication_classes = (ExampleAuthentication,)
permission_classes = (IsAuthenticated ,)
def get()...
试试这个:
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth.models import User
user = User.objects.first()
refresh = RefreshToken.for_user(user)
raw_token = str(refresh.access_token)
jwt_a = JWTAuthentication()
validated_token = jwt_a.get_validated_token(raw_token)
repr(validated_token)
print(validated_token["user_id"])
在这里,我将原始访问令牌提供给 JWTAuthentication class 的 get_validated_token()
方法。它 returns 一个包含这些键的字典:token_type
、jti
、user_id
、exp
以及它们的关联值。
我为我的示例使用了默认的 Django 用户模型,但它应该适用于您的自定义模型。
还有更多有用的方法,例如 get_header()
。也检查 this document and this one。