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

相关文章
|
4月前
|
存储 安全 网络协议
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
31 0
Python 教程之 Django(9)对模型中的字段进行验证
|
9月前
|
JSON 安全 数据安全/隐私保护
Django之JWT库与SimpleJWT库的使用
使用Django框架时,可以选择jwt或simplejwt来增强其功能。这两个扩展提供了与JWT认证相关的功能,可以帮助实现安全而高效的用户认证和授权机制。通过使用它们,可以轻松地将JWT集成到Django应用程序中,并提供可靠的用户身份验证和权限管理功能。
254 1
|
9月前
|
Java
SpringBoot 整合JWT实现基于自定义注解的-登录请求验证拦截(保姆级教学,附:源码)2
SpringBoot 整合JWT实现基于自定义注解的-登录请求验证拦截
144 0
|
1月前
|
JSON 安全 关系型数据库
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
|
4月前
|
JavaScript 前端开发 数据库
vue与jwt验证
vue与jwt验证
32 0
|
4月前
|
JSON 算法 前端开发
gin框架JWT验证实践(原理介绍,代码实践)
gin框架JWT验证实践(原理介绍,代码实践)
54 0
|
5月前
|
存储 数据库 Python
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
39 0
|
5月前
|
Python
django auth模块使用jwt进行登录不能更新last_login!
今天使用django自带的用户系统,进行jwt,重写了user模型,使用手机登录,于是就想用django自带的登录验证... 哎,一切折腾都在于不熟悉
37 0
|
5月前
|
API Python
Django实现jwt方式登录
jwt的概念这边就不再阐述了,就是cookie的替代品 view.py
31 0
|
6月前
|
存储 安全 前端开发
深入探讨安全验证:OAuth2.0、Cookie与Session、JWT令牌、SSO与开放授权平台设计
这篇文章讨论了认证和授权的概念,并探讨了设计权限认证框架的原则。它还比较了Cookie和Session的区别,并探讨了处理分布式部署时的Session保存问题。此外,文章还介绍了CSRF攻击及其防范方法,以及OAuth2.0、JWT令牌和SSO的概念。最后,文章提出了设计开放授权平台时需要考虑的因素。
101 0
深入探讨安全验证:OAuth2.0、Cookie与Session、JWT令牌、SSO与开放授权平台设计