解决Python修改pyjwt模块默认header无效的问题

解决Python修改pyjwt模块默认header无效的问题

发现问题

引用我另一篇博文的内容:

Python中的pyjwt模块内置header固定为 { “typ”: “JWT”,“alg”: “HS256”}, 只能添加无法修改。
在header的typ和alg顺序不同时,会导致Base64编码后的数据不同,具体数据如下。

{ “typ”: “JWT”,“alg”: “HS256”} Base64=> eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
{ “alg”: “HS256”,“typ”: “JWT”} Base64=> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

分析问题

使用不同的header进行测试,查看结果

import jwt


def get_token(header):
    payload = {"name": "ITHOMIA", "email": "ithomia@outlook.com", "qq": "3339118668"}
    secret = 'ITHOMIA'
    return jwt.encode(headers=header, payload=payload, key=secret).decode().split('.')[0]


if __name__ == '__main__':
    header1 = {"typ": "JWT", "alg": "HS256"}
    header2 = {"alg": "HS256", "typ": "JWT"}
    header4 = {"typ": "JWT"}
    header5 = {"alg": "HS256"}
    header3 = {}
    header6 = {'name': '左素'}
    header7 = {"alg": "HS256", "typ": "JWT",'name': '左素'}
    print(get_token(header1))
    print(get_token(header2))
    print(get_token(header3))
    print(get_token(header4))
    print(get_token(header5))
    print(get_token(header6))
    print(get_token(header7))

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsIm5hbWUiOiJcdTVkZTZcdTdkMjAifQ
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsIm5hbWUiOiJcdTVkZTZcdTdkMjAifQ

由输出结果可知:
在header中不包含除"typ","HS256"以外的元素时:
	header会被初始化为:{"typ": "JWT", "alg": "HS256"}
在header中包含除"typ","HS256"以外的元素时:
	header会被生成为:{"typ": "JWT", "alg": "HS256", 传入的元素}

解决问题

按住command点击 jwt模块进入__init__.py
在这里插入图片描述

按住command点击PyJWS模块进入api_jws.pyclass PyJWS
在这里插入图片描述

api_jws.pyclass PyJWS中第93行的header置空:

        header = {"typ": "JWT", "alg": "HS256"}

改为

        header = {}

再次测试

用同样的代码再次进行测试,得到想要的运行结果:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
e30
eyJ0eXAiOiJKV1QifQ
eyJhbGciOiJIUzI1NiJ9
eyJuYW1lIjoiXHU1ZGU2XHU3ZDIwIn0
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsIm5hbWUiOiJcdTVkZTZcdTdkMjAifQ

总结

在模块内置代码中,已经默认设置 header = {"typ": "JWT", "alg": "HS256"}。如果再次传入header,会调用update()方法来更新header。update()方法只检查字段不检查顺序,同时也不会删除已有的字段,所以才会出现传入header无效的情况。

编辑于 Tue Feb 4 09:37:52 2020
左素

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值