Token是无状态协议中认证用户的一种形式,不受域名限制,而JWT只是一种实现形式,通过在客户端存储payload来降低服务端压力。
TOKEN是一个宽泛的概念,翻译为令牌, 是访问资源的凭证。
JWT是json web token缩写。用点号分为三段,分别表示头、信息和签名。可以使用在RESTFUL接口定义, 也可以使用在普通的web。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过密钥验证token的正确性,判断是否通过验证。
第一部分:header
#一般固定如下
{
'typ': 'JWT',
'alg': 'HS256'
}
base64编码 ,并替换=号---> "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"第二部分: payload
{
'id': user.id,
'username': user.username,
‘exp’: time.time() + 300, #过期时间
}
base64编码-> "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZvaG4gRGdWV9"第一部分和第二部分, 可以被其他人使用base64解密,不建议存储敏感信息
第三部分: 前两部分的编码串通过 ‘.’ 连接,得到如下:
temp = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZvaG4gRGdWV9"然后使用第一部分 声明的算法HS256进行加密,得到如下:
import hmac
h = hmac.new(b'key', temp.encode(), digestmod='SHA256')
sign = base64.urlsafe_b64encode(h.digest())---------------------------------------------------------------------------------------------------------------------
pip install pyjwt
## <1>封装一个函数方法
import jwt
from project_p6 import settings
# 生成token 函数
def generate_jwt(payload): # 函数里传一个payload参数
token = jwt.encode(payload=payload, key=settings.SECRET_KEY, algorithm='HS256')
return token视图加入token:
class UserApi(APIView):
def post(self, request):
# TODO 生成token
data_ = {
'id': new_user.id,
'user': new_user.username,
'mobile': new_user.mobile
}
token = generate_jwt(data_) # 导入使用封装的方法
return Response({'token': token})## 前端把token保存在浏览器本地储存
localStorage.setItem('token', resp.data.token)
// sessionStorage.setItem('')
版权声明:本文为Ben_boba原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。