版权声明:未经允许,私自转载,版权必究。 https://blog.csdn.net/Charles_TheGod/article/details/83017922
JWT就是一串字符串,里面由三部分组成
- 头部(header)
1 token类型,加密的算法,使用base64加密,加密之后的内容就是头部,base64
加密的内容很容易被破解 - 载荷(payload)
1 保存有效的信息,用户的一些信息,用户名,用户id,手机号…
2 exp: token数据的有效时间
3 使用base64加密,加密之后的内容就是载荷 - 签名(signature)
1 防止JWT token被伪造
2生成: 服务器在生成jwt token数据时,将header
和payload
进行拼接,用.
隔开,然后对拼接的字符串使用一个密钥进行加密,加密之后的内容就是签名。
3 签名是服务器使用自己的秘钥进行加密的,保证了token的安全性,一样则通过,不一样则伪造
注意点
- 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
- 服务器,保护好secret私钥,该私钥非常重要,泄露则JWT token很容易被伪造。
- 如果可以,请使用https协议
Django REST framework JWT
可以帮助我们生成和校验JWT token
# 首先进行一个安装
pip install djangorestframework-jwt
在配置文件中进行配置
"""settings.py"""
# DRF 配置
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
# 添加 JWT 认证机制
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
JWT_AUTH = {
"""指明token的有效期"""
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}
使用
"""有服务器生成一个JWT token数据,包含用户登录信息"""
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
# 生成载荷
payload = jwt_payload_handler(user)
# 生成JWT token
token = jwt_encode_handler(payload)
"""给user对象添加token属性,保存服务器签发的JWT token数据"""
user.token = token
增加字段
token = serializers.CharField(lable="JWT token", read_only = True)
客户端保存我们JWT 签发的token
我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里
浏览器的本地存储提供了sessionStorage 和 localStorage 两种:
sessionStorage 浏览器关闭即失效
localStorage 长期有效
使用方法
sessionStorage.变量名 = 变量值 // 保存数据
sessionStorage.变量名 // 读取数据
sessionStorage.clear() // 清除所有sessionStorage保存的数据
localStorage.变量名 = 变量值 // 保存数据
localStorage.变量名 // 读取数据
localStorage.clear() // 清除所有localStorage保存的数据
sessionStorage.clear();
localStorage.clear();
localStorage.token = response.data.token;
localStorage.username = response.data.username;
localStorage.user_id = response.data.id;
Django REST framework JWT提供了登录签发JWT的视图,可以直接使用
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^authorizations/$', obtain_jwt_token),
]
但是默认的返回值仅有token,我们还需在返回值中增加username和user_id。
通过修改该视图的返回值可以完成我们的需求。
在users/utils.py 中,创建
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt认证成功返回数据
"""
return {
'token': token,
'user_id': user.id,
'username': user.username
}
修改配置文件settings
# JWT
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}