Python在没有库的情况下手动创建jwt令牌

nog*_*ist 4 python jwt

我想在没有 python 库的情况下手动生成 jwt 令牌。我为此搜索了详细信息或教程,但找不到。python 中有关 jwt 的所有信息都包含在库中。有什么资源可以让我在 python 中生成 jwt 令牌吗?

Ada*_* DS 9

我遇到这个 SO 线程是因为我想在不使用 JWT 库的情况下为 Zoom 创建一个 JWT。根据 darth baba 的建议,我浏览了 PyJWT 源代码,使用默认库重新创建了实现。希望这对将来的其他人有所帮助:

import base64
import json
import hmac
import hashlib
from datetime import datetime, timedelta

api_key = 'XXXXXX'
api_sec = 'XXXXXX'

due_date = datetime.now() + timedelta(minutes=10)
expiry = int(due_date.timestamp())

def base64url_encode(input: bytes):
    return base64.urlsafe_b64encode(input).decode('utf-8').replace('=','') 

def jwt(api_key, expiry, api_sec):
    
    segments = []
    
    header = {"typ": "JWT", "alg": "HS256"}
    payload = {"iss": api_key, "exp": expiry}
    
    json_header = json.dumps(header, separators=(",",":")).encode()
    json_payload = json.dumps(payload, separators=(",",":")).encode()
    
    segments.append(base64url_encode(json_header))
    segments.append(base64url_encode(json_payload))
    
    signing_input = ".".join(segments).encode()
    key = api_sec.encode()
    signature = hmac.new(key, signing_input, hashlib.sha256).digest()

    segments.append(base64url_encode(signature))
                    
    encoded_string = ".".join(segments)

    return encoded_string 
Run Code Online (Sandbox Code Playgroud)


nog*_*ist 6

这是一位资深同事教给我的。如果你想制作一个简单的库,就不需要庞大的库。

def base64url_decode(input):
    
    return base64.urlsafe_b64decode(input)
def base64url_encode(input):
    stringAsBytes = input.encode('ascii')
    stringAsBase64 = base64.urlsafe_b64encode(stringAsBytes).decode('utf-8').replace('=','')
    return stringAsBase64 


def jwt_creator(expiration, userid, userrole):
    header = {
        "alg": "HS256",
        "typ": "JWT"
    }
    payload = {'expired': expiration,
               'userid': userid,
               'userrole': userrole
               }
    secret_key = secrets.token_urlsafe(32)    
    total_params = str(base64url_encode(json.dumps(header))) + '.' + str(base64url_encode(json.dumps(payload)))
    signature = hmac.new(secret_key.encode(), total_params.encode(), hashlib.sha256).hexdigest()
    token = total_params + '.' + str(base64url_encode(signature))
    return token
Run Code Online (Sandbox Code Playgroud)