什么是JSON Web Token(JWT)?
JSON Web Token,简称JWT,是一种开放标准(RFC 7519),用于在网络上传输信息,特别是在身份验证和授权方面。JWT是一串编码后的JSON格式字符串,它由三个部分组成:头部(Header)、负载(Payload)和签名(Signature)。
Header
头部包含了两个部分:令牌类型(即JWT)和哈希算法(例如HMAC SHA256或RSA)。它使用Base64编码。
Payload
负载包含了要传输的数据,例如用户ID、角色、访问权限等。它也使用Base64编码。
Signature
签名是JWT的第三部分,它使用头部和负载中的数据以及一个密钥来生成。它用于验证消息的完整性和验证发送方的身份。它也使用Base64编码。
整个JWT看起来像这样:xxxxx.yyyyy.zzzzz
Django JWT验证
在Django中,我们可以使用第三方库djangorestframework-jwt
来实现JWT的验证。
安装
我们首先需要安装djangorestframework-jwt
库。可以通过以下命令进行安装:
pip install djangorestframework-jwt
配置
在settings.py
文件中添加以下内容:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), } JWT_AUTH = { 'JWT_SECRET_KEY': SECRET_KEY, 'JWT_ALGORITHM': 'HS256', 'JWT_ALLOW_REFRESH': True, 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30), }
这里需要注意的是,JWT_SECRET_KEY
是必须的,它用于生成签名。如果没有指定,则默认从Django的SECRET_KEY
中获取。JWT_EXPIRATION_DELTA
指定了JWT的过期时间,这里设置为7天。JWT_REFRESH_EXPIRATION_DELTA
指定了JWT的刷新时间,这里设置为30天。
创建Token
要创建JWT,我们需要调用jwt_encode_handler
:
from rest_framework_jwt.utils import jwt_encode_handler payload = { 'user_id': user.id, 'username': user.username, } jwt_token = jwt_encode_handler(payload)
这里的payload
包含了我们要传输的数据,例如用户ID和用户名。
验证Token
在视图中,我们可以使用@jwt_authentication_classes
装饰器来验证JWT:
from rest_framework_jwt.authentication import JSONWebTokenAuthentication from rest_framework.decorators import api_view, authentication_classes, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response @api_view(['GET']) @authentication_classes([JSONWebTokenAuthentication]) @permission_classes([IsAuthenticated]) def my_view(request): content = {'message': 'Hello, World!'} return Response(content)
这里的@authentication_classes([JSONWebTokenAuthentication])
和@permission_classes([IsAuthenticated])
是必须的,它们用于验证JWT并确定用户是否已通过身份验证。
刷新Token
如果JWT已过期,我们可以使用jwt_refresh_handler
来刷新它:
from rest_framework_jwt.utils import jwt_refresh_handler new_jwt_token = jwt_refresh_handler(jwt_token)
这里的jwt_token
是我们之前生成的JWT,new_jwt_token
是刷新后的JWT。
总结
Django JWT验证是一种安全的身份验证方法,通过使用djangorestframework-jwt
库,我们可以轻松地实现JWT的创建、验证和刷新。