Django中使用jwt--超详细

python学习交流公众号 Hello Python上线啦,欢迎关注

一:什么是jwt?

jwt被广泛用于各类鉴权中,其中jwt token如下所示:

b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkaW1uIn0.MeQOdDiiI39mBpgbFNnBVNdJMDhUpRTxziPeFJKB2fA'
jwt token
  JWT生成的Token是一个用两个点(.)分割的长字符串
  点分割成的三部分分别是Header头部,Payload负载,Signature签名:Header.Payload.Signature
  JWT是不加密的,任何人都可以读的到其中的信息,其中
    第一部分Header和第二部分Payload只是对原始输入的信息转成了base64编码,
    print(base64.b64decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9'))
    print(base64.b64decode('eyJ1c2VybmFtZSI6ImFkaW1uIn0='))    
    #这里最后加=的原因是base64解码对传入的参数长度不是2的对象,需要再参数最后加上一个或两个等号=
    第三部分Signature是用header+payload+secret_key进行加密的结果。应确保私钥的保密性。保证signature不可伪造。
    主要用在下文Signature签名中,服务端用来校验Token合法性,解密成功说明Token正确,且数据没有被篡改

二:Django中使用jwt?

  1. 安装:
pip install pyjwt
  1. 加密:
def get_jwt_token(user_name, role_data='default'):
    """
    生成jwt-token
    :param unit_name:
    :param role_data:
    :return:
    """
    payload = {
     
        'exp': datetime.utcnow() + timedelta(seconds=3600),  # 单位秒
        'iat': datetime.utcnow(),
        'data': {
     'username': user_name, 'role_data': role_data}
    }
    encoded_jwt = jwt.encode(payload, JWT_SECRET_KEY, algorithm='HS256')
    return str(encoded_jwt, encoding='utf8')
  1. 解密:

def decode_jwt_token(encoded_jwt):
    # 关闭过期时间检验
    de_code = jwt.decode(encoded_jwt, JWT_SECRET_KEY, algorithms=['HS256'])
    return de_code
  1. 前端获取及存储token
// 加密后的token传给前端,进行存储。
// 存储
localStorage.setItem("lastname", "Smith");
// 检索
document.getElementById("result").innerHTML = localStorage.getItem("lastname");
//退出时
localstorge.clear()方法,token被清空
  1. 前端携带token,加入headers,如下:
"Authori":"Token"
  1. django后端获取token
http_authori = request.META.get('HTTP_AUTHORI')

你可能感兴趣的:(Django,jwt,python,django,pyjwt,django鉴权)