Django JWT验证

简介: Django JWT验证

什么是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的创建、验证和刷新。

相关文章
|
6月前
|
JSON 算法 安全
Nest.js JWT 验证授权管理
Nest.js JWT 验证授权管理
144 3
Nest.js JWT 验证授权管理
|
6月前
|
存储 安全 网络协议
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
59 0
Python 教程之 Django(9)对模型中的字段进行验证
|
13天前
|
JSON 安全 算法
|
2月前
|
存储 中间件 API
ThinkPHP 集成 jwt 技术 token 验证
本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。
ThinkPHP 集成 jwt 技术 token 验证
|
6月前
|
安全 Java 应用服务中间件
Shiro + JWT 进行登录验证
Shiro + JWT 进行登录验证
55 2
|
3月前
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
|
3月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
62 0
|
3月前
|
API
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
|
3月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
|
3月前
|
JSON 算法 API
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token