Python 实现 JWT 生成

Python 实现 JWT 生成

JWT 简介:https://www.jianshu.com/p/576dbf44b2ae

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON 的开放标准((RFC 7519)。该token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token 也可直接被用于认证,也可被加密。

JWT 由三段信息构成:Header, Payload, Signature

Header 通常声明文件类型、加密算法

Payload 以JSON 形式记录要传输的数据

Signature 为签名,用来做验证

base64UrlEncode

jwt.io 生成jwt 时会发现签名中使用了一种base64UrlEncode 的方法,这个方法的基本功能如下:

  1. 输入一个utf-8编码的字符串s1
  2. 将字符串s1使用base64编码得到字符串s2
  3. 如果s2末尾有等号,去除末尾的所有等号
  4. 如果s2中含有加号(+),将所有加号替换为减号(-)
  5. 如果s2中含有斜杠(/),将所有斜杠替换为下划线(_)

下面的b64url函数实现了上述过程

实现一个HS256 加密的 JWT 生成

# -*- coding: utf-8 -*-

import hmac
import base64
from hashlib import sha256
from urllib import parse as urlp

def b64url(str1):
    if type(str1) == str:
        return str(base64.b64encode(str1.encode('utf-8')), encoding="utf-8").strip('=').replace('+','-').replace('/','_')
    elif type(str1) == bytes:
        return str(base64.b64encode(str1), encoding="utf-8").strip('=').replace('+','-').replace('/','_')
    else:
        raise TypeError("The type of given argument must be string or bytes")

# Enter Your Infomation Here ...
header = b64url('{"alg":"HS256","typ":"JWT"}')
payload = b64url('{"sub":"1234567890","name":"John Doe","iat":1516239022}')
secret = 'happynewyear'.encode('utf-8')
# ###

sig = b64url(hmac.new(
    secret, (header+'.'+payload).encode('utf-8'), digestmod=sha256
).digest())

jwt = header+'.'+payload+'.'+sig
print(jwt)
posted @ 2020-12-07 00:57  soowin  阅读(991)  评论(0编辑  收藏  举报