python实现jwt加密的两种方式

一,不用借助jwt模块,python 实现jwt HS256加密

import hashlib
import json
import base64
import hmac
import time


def base64url_encode(input):
    return base64.urlsafe_b64encode(input).replace(b'=', b'')


def sign(self, msg, key):
    return hmac.new(key, msg, self.hash_alg).digest().decode('utf-8')


segments = []
header = {'type': 'sign', 'alg': 'HS256'}
json_header = json.dumps(
    header,
    separators=(',', ':')
).encode('utf-8')

payload = {'timestamp': time.time()}
payload = json.dumps(
    payload,
    separators=(',', ':')
).encode('utf-8')
segments.append(base64url_encode(json_header))
segments.append(base64url_encode(payload))
signing_input = b'.'.join(segments)
print(signing_input)
signature = hmac.new('iospl4xn1ccrgr4p5u7wkvcnsnz42uxgbj07vvmx'.encode('utf-8'), signing_input, hashlib.sha256).digest()
segments.append(base64url_encode(signature))
r = b'.'.join(segments)
print(r.decode('utf-8'))

二,借助JWT模块加密

import jwt

class JwtToken(object):

    _salt = '-)t&-j=^)xjy+=^nr*(#xj-ql+zmrt8o1rvon8v@^*wf742%f*'

    _expire_message = dict(code=1200, msg="token 已经失效")

    _unknown_error_message = dict(code=4200, msg="token 解析失败")

    @classmethod
    def generate_token(cls, payload: dict) -> str:
        headers = dict(typ="jwt", alg="HS256")
        resut = jwt.encode(payload=payload, key=cls._salt, algorithm="HS256",headers=headers).decode('utf-8')
        return resut

    @classmethod
    def parse_token(cls, token: str) -> tuple:
        verify_status = False
        try:
            payload_data = jwt.decode(token, cls._salt, algorithms=['HS256'])
            verify_status = True
        except jwt.ExpiredSignatureError:
            payload_data = cls._expire_message
        except Exception as _err:
            payload_data = cls._unknown_error_message
        return verify_status, payload_data
'''
jwt.encode(
        payload,
        key,
        api_settings.JWT_ALGORITHM
    ).decode('utf-8')
'''

if __name__ == '__main__':
    TEST_DATA = dict(username='admin', exp=datetime.utcnow() + timedelta(days=1))
    token = JwtToken.generate_token(TEST_DATA)
    print(token)
    payload = JwtToken.parse_token(token)
    print(payload)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值