
在Django REST Framework中,基于JSON Web Token (JWT) 的身份验证是一种常见的身份验证方法。JWT是一种基于标准JSON格式的开放标准,它可以用于安全地将信息作为JSON对象传输。
首先,您需要安装djangorestframework_simplejwt,这是一个第三方包,可以轻松地实现基于JWT的身份验证。您可以使用以下命令安装它:
pip install djangorestframework_simplejwt安装完成后,您需要将以下内容添加到您的Django设置文件中:
# settings.py
INSTALLED_APPS = [
# ...
'rest_framework_simplejwt',
# ...
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}在配置完成后,您可以使用djangorestframework_simplejwt中的jwt模块来生成和验证JWT令牌。下面是一个示例:
from rest_framework_simplejwt.tokens import RefreshToken
# 生成Token
def generate_token(user):
refresh = RefreshToken.for_user(user)
return {
'refresh': str(refresh),
'access': str(refresh.access_token),
}
# 验证Token
def validate_token(token):
try:
RefreshToken(token).blacklist()
return True
except:
return False在上面的示例中,我们定义了generate_token()函数,它接受一个用户实例,并使用RefreshToken.for_user()方法生成JWT令牌。返回的字典包含两个令牌:refresh和access。refresh令牌用于在用户的访问令牌过期时刷新令牌。access令牌用于每个API请求的身份验证。
我们还定义了validate_token()函数,它接受一个JWT令牌,并使用RefreshToken.blacklist()方法来验证和黑名单令牌。如果JWT令牌有效,则返回True。如果JWT令牌无效,则返回False。
一旦您已经生成JWT令牌,就可以在Django REST Framework中使用它来进行身份验证了。您可以使用JWTAuthentication类来实现基于JWT的身份验证。下面是一个示例:
from rest_framework.authentication import SessionAuthentication
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_simplejwt.authentication import JWTAuthentication
class ExampleView(APIView):
authentication_classes = [JWTAuthentication, SessionAuthentication]
def get(self, request, format=None):
content = {
'user': str(request.user), # `django.contrib.auth.User` instance.
'auth': str(request.auth), # `rest_framework_simplejwt.authentication.JWTAuthentication` instance.
}
return Response(content)在上面的示例中,我们使用了JWTAuthentication类进行身份验证。在get()方法中,我们使用了request.user属性来获取当前经过身份验证的用户。由于我们还使用了SessionAuthentication类,因此如果用户未经过身份验证,则会回退到会话身份验证。
如果用户未经过身份验证,则会引发HTTP 401未经授权错误。您可以通过为authentication_classes属性设置一个列表来控制哪些身份验证类应用于视图。
在Django REST Framework中,您可以使用SIMPLE_JWT设置来配置JWT选项。以下是一些常见的选项:
# settings.py
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('Bearer',),
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
}上述选项中,ACCESS_TOKEN_LIFETIME和REFRESH_TOKEN_LIFETIME用于设置访问令牌和刷新令牌的过期时间。ROTATE_REFRESH_TOKENS和BLACKLIST_AFTER_ROTATION用于控制是否在使用新的刷新令牌时将旧的刷新令牌加入黑名单。ALGORITHM用于设置JWT使用的加密算法。SIGNING_KEY和VERIFYING_KEY用于签名和验证JWT。AUTH_HEADER_TYPES用于设置使用的身份验证头。USER_ID_FIELD和USER_ID_CLAIM用于设置用户ID。AUTH_TOKEN_CLASSES用于设置JWT的类。TOKEN_TYPE_CLAIM用于设置令牌类型声明。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。