在Django REST Framework中,基于JSON Web Token (JWT) 的身份验证是一种常见的身份验证方法。JWT是一种基于标准JSON格式的开放标准,它可以用于安全地将信息作为JSON对象传输。
安装和配置
首先,您需要安装djangorestframework_simplejwt
,这是一个第三方包,可以轻松地实现基于JWT的身份验证。您可以使用以下命令安装它:
pip install djangorestframework_simplejwt
安装完成后,您需要将以下内容添加到您的Django设置文件中:
代码语言:javascript复制# settings.py
INSTALLED_APPS = [
# ...
'rest_framework_simplejwt',
# ...
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
生成和验证Token
在配置完成后,您可以使用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的身份验证
一旦您已经生成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
属性设置一个列表来控制哪些身份验证类应用于视图。
JWT的配置选项
在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
用于设置令牌类型声明。