使用Python手动创建JWT令牌,而不使用任何库。

4

我想在Python中手动生成JWT令牌,而不使用任何库。我搜索了详细的信息或教程,但无法找到。关于Python中的JWT的所有信息都包括在库中。是否有任何资源可以帮助我生成Python的JWT令牌?


你的帖子有些令人困惑。我想在项目中导入jwt,但它显示jwt未被访问 - 这只是表示您正在导入一个您不使用的东西。- 不想使用任何库 - 但是为什么你不想使用它时要导入它呢?根据手动操作的程度,手动创建和验证令牌并不难。关于base64编码和哈希函数的库可用吗?在https://jwt.io/introduction上解释了您需要做什么。当然,您可以进一步分解,手动进行base64编码和解码,手动创建hmac等。 - jps
我是初学者。我以为JWT是默认集成的,但后来意识到它并不是。我正在寻找Python教程或更详细的信息来完成这些步骤。 - nogabemist
3个回答

9
我之所以看到这个Stack Overflow的帖子,是因为我想创建一个Zoom的JWT而不使用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 

5
一位资深同事教给了我这个方法。如果你只想做一个简单的图书馆,就没有必要使用庞大的资源。
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

高级同事忘记向您解释,Base64 输出填充 可以是""、"=" 或 "==",取决于字符串长度,而 JWT 不具有填充。但是,当使用 urlsafe_b64decode() 时,您可以完全省略填充,即只需调用 return base64.urlsafe_b64decode(input) - Alexander Farber
1
@AlexanderFarber 没错。已更新。 - nogabemist

-2

PyJWT

PyJWT是一个Python库,允许您编码和解码JSON Web Tokens(JWT)。

安装:

pip install pyjwt

JWT身份验证的教程可以在官方文档中找到。


1
我见过很多库,但是我想学习并不想使用任何库。我相信一定有纯JWT身份验证教程。 - nogabemist
浏览GitHub上该库的源代码,您将了解如何在没有任何库的情况下实现它的方法。https://github.com/jpadilla/pyjwt - darth baba
我正在检查源代码,但对我来说似乎太复杂了。我只想生成HS256密钥,但我无法确定需要哪些部分。教程或文档会很有帮助。 - nogabemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接