解决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": "[email protected]", "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
左素

发布了2 篇原创文章 · 获赞 3 · 访问量 404

猜你喜欢

转载自blog.csdn.net/m0_46261074/article/details/104165261
今日推荐