DRF中使用jwt (避坑版)
文章目录
1.什么是jwt
1.1 jwt简介
JSON Web Token (JWT) 是一种开放标准 ( RFC 7519 ),它定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。该信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
尽管 JWT 可以加密以在各方之间提供保密性,但我们将重点关注签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则向其他方*隐藏这些声明。*当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。
1.2 什么时候应该使用 jwt?
以下是 JSON Web 令牌一些场景:
- 授权:这是使用 JWT 最常见的场景。用户登录后,每个后续请求都将包含 JWT,从而允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小并且能够轻松地跨不同域使用。(支持跨域)
- 信息交换:JSON Web 令牌是在各方之间安全传输信息的好方法。因为 JWT 可以进行签名(例如,使用公钥/私钥对),所以您可以确定发送者就是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否未被篡改。
1.3 jwt优势
1.4 JSON Web Token 结构
样板:
xxxxx.yyyyy.zzzzz -> 标头,有效载荷,签名
一个token解码后如下:
1.5 如何使用jwt token(acess token)
在请求api时候(前端向后端请求数据时),请求头headers加上
Authorization: Bearer <token>
2. django-rest-framework 集成simple jwt认证
2.1 安装
pip install djangorestframework-simplejwt
2.2 配置Settings文件
- INSTALLED_APPS:在INSTALLED_APPS中添加djangorestframework_simplejwt应用程序:
INSTALLED_APPS = [
# ...
'rest_framework_simplejwt',
]
- REST_FRAMEWORK:添加simplejwt到身份验证类列表中:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
...
}
- 添加SIMPLE_JWT配置(按需设置)
# JWT配置
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), # Access Token的有效期
'REFRESH_TOKEN_LIFETIME': timedelta(days=7), # Refresh Token的有效期
# 对于大部分情况,设置以上两项就可以了,以下为默认配置项目,可根据需要进行调整
# 是否自动刷新Refresh Token
'ROTATE_REFRESH_TOKENS': False,
# 刷新Refresh Token时是否将旧Token加入黑名单,如果设置为False,则旧的刷新令牌仍然可以用于获取新的访问令牌。需要将'rest_framework_simplejwt.token_blacklist'加入到'INSTALLED_APPS'的配置中
'BLACKLIST_AFTER_ROTATION': False,
'ALGORITHM'