当前位置:   article > 正文

Python JWT 介绍

python jwt

JWT 全称: json-web-token

JWT的大白话解释:
现在比较火的token中的一种,为了解决HTTP协议无状态的问题,开发出来的。就是一种解决方案。

1. 三大组成

JWT和cookie、session相比:

第一部分

  1. header

    在Python来看就是一个字典格式,元数据如下:

    1. {'alg':'HS256', 'typ':'JWT'}
    2. # alg代表要使用的 算法 HMAC-SHA256 简写HS256
    3. # typ表明该token的类别 此处必须为 大写的 JWT
    4. # 该部分数据需要转换成json串并用base64转码

    payload

    在cookie和session中会将用户id或名字写入到其中,在token中会将其写在payload中。

    格式为字典-此部分分为公有声明和私有声明

    公有声明: JWT提供了内置关键字用于描述常见的问题

    此部分均为可选项,用户根据自己需求 按需添加key,常见公共声明如下:
     

    1. {'exp':xxx, # EXpiration Time 此token的过期时间的时间戳 time.time()+300s 给一个未来过期时间
    2. 'iss':xxx, # (issuer) Claim 指明此token的签发者 是那台机器签发的token (当前项目没用)
    3. 'aud':xxx, # (Audience) Claim 指明此token的签发群体 token签发面向群体是那些人 区分pc,ios,android (当前项目没用)
    4. 'iat':xxx, # (ISSued At) Claim 指明此创建时间的时间戳
    5. # 以上四项是我们的公有声明 保留字
    6. # 下边私有声明
    7. 'username':'xxx',
    8. }

    私有声明: 用户可根据自己业务需求,添加自定义的key,

    公有声明和私有声明均在同一个字典中;转成json串并用bsase64转码

    Signature 签名

    签名规则如下:

    根据header中的alg确定具体算法,以下用HS256为例:

    HS256(自定义的key,base64后的header + b’.‘ + base64后的payload,digestmod=‘SHA256’)

    2. jwt结果格式

  2. base64(header) + b'.' + base64(payload) + b'.' + base64(Signature)

  3. . 校验jwt规则

  4. 解析header,确认alg使用的算法
  5. 签名校验-根据传过来的header和payload按 alg指明的算法进行签名,将签名结果和传过来的sign进行对比,若比对一致,则校验通过
  6. 获取payload自定义内容
  7. 第一部分:header
    1. #一般固定如下
    2. {
    3. 'typ': 'JWT',
    4. 'alg': 'HS256'
    5. }
    6. base64编码 ,并替换=号---> "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"

    第二部分: payload

    1. {
    2. 'id': user.id,
    3. 'username': user.username,
    4. ‘exp’: time.time() + 300, #过期时间
    5. }
    6. base64编码-> "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZvaG4gRGdWV9"

    第三部分: 前两部分的编码串通过 ‘.’ 连接,得到如下:

    temp = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZvaG4gRGdWV9"

    然后使用第一部分 声明的算法HS256进行加密,得到如下:

    1. import hmac
    2. h = hmac.new(b'key', temp.encode(), digestmod='SHA256')
    3. sign = base64.urlsafe_b64encode(h.digest())

    全部代码

    1. import datetime
    2. import jwt #需要安装pip install pyjwt
    3. from django.conf import settings
    4. def generate_token(user):
    5. """
    6. :param user: 用户对象
    7. :return: 生成的token
    8. """
    9. #自己组织payload
    10. payload = {
    11. 'user_id': user.id,
    12. 'username': user.username,
    13. 'exp': datetime.datetime.now() + datetime.timedelta(seconds=300)
    14. }
    15. token = jwt.encode(payload=payload, key=settings.SECRET_KEY, algorithm='HS256')
    16. return token

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/508560
推荐阅读
相关标签
  

闽ICP备14008679号