【JWT】jwt理解,并手写实现jwt令牌分发和jwt令牌验证

 

 

JWT_Assign.py

复制代码
import hashlib
import hmac
import json
import base64
class JWT_Assign(object):    
    def __init__(self,secret):#初始化秘钥
        self.secret=secret
    def get_jwt_token(self,header,payload):#分发jwt令牌
        header_str=json.dumps(header)
        header_base64_str=base64.b64encode(header_str.encode('utf-8'))
        payload_str=json.dumps(payload)
        payload_base64_str=base64.b64encode(payload_str.encode('utf-8'))
        string=b".".join([header_str.encode('utf-8'),payload_str.encode('utf-8')])
        sign=base64.b64encode(hmac.new(self.secret.encode('utf-8'),string,hashlib.sha256).digest())
        jwt_str=b".".join([header_base64_str.replace(b'=',b'?'),payload_base64_str.replace(b'=',b'?')\
            ,sign.replace(b'=',b'?')])
        return jwt_str.decode('utf-8')
    def check_jwt_token(self,jwt_str):#验证jwt令牌,防止token被恶意修改
        jwt_parts=jwt_str.split('.')
        header_base64_str=jwt_parts[0].replace('?', '=')
        payload_base64_str=jwt_parts[1].replace('?', '=')
        sign_str=jwt_parts[2].replace('?', '=')
        header_str=base64.b64decode(header_base64_str.encode('utf-8'))
        payload_str=base64.b64decode(payload_base64_str.encode('utf-8'))
        string=b'.'.join([header_str,payload_str])
        sign_check=base64.b64encode(hmac.new(self.secret.encode('utf-8'),string,hashlib.sha256).digest()\
            ).decode('utf-8') 
        if sign_check == sign_str:
            return True,json.loads(payload_str)
     return False,json.loads(payload_str)
复制代码

验证demo

复制代码
    header={
        'type':'JWT',
        'alg':'sha256'
    }
    payload={
        'iss':'wgy',
        'iat':'user'
    }
    #验证JWT_Assign.py
    from JWT_Assign import JWT_Assign
    jwt_assign_obj=JWT_Assign('wangguangyuan1')
    jwt_rst=jwt_assign_obj.get_jwt_token(header,payload)
    print(jwt_rst)#eyJ0eXBlIjogIkpXVCIsICJhbGciOiAic2hhMjU2In0?.eyJpc3MiOiAid2d5IiwgImlhdCI6ICJ1c2VyIn0?.WykGWmyrA/eIoNOST44yYAEmf84yFDjKnw55wQyUkH4?
    print(jwt_assign_obj.check_jwt_token(jwt_rst))#True
复制代码

 

posted @   王广元  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
分享到:
点击右上角即可分享
微信分享提示