【问题标题】:Python manually create jwt token without libraryPython手动创建没有库的jwt令牌
【发布时间】:2021-09-17 07:42:57
【问题描述】:

我想手动生成 jwt 令牌,而不需要 python 中的任何库。我为此搜索了详细信息或教程,但我不能。 python 中有关 jwt 的所有信息都包含在库中。有什么资源可以让我在 python 中生成 jwt 令牌?

【问题讨论】:

  • 你的帖子很混乱。 我想在项目中导入 jwt,它说 jwt 未被访问 - 这只是意味着您正在导入不使用的东西。 - 不想使用任何库 - 但是当你不想使用它时为什么要导入它?手动创建和验证令牌并不困难,具体取决于手动操作的级别。 base64 编码和散列的库可以吗?在jwt.io/introduction 上,它解释了您需要做什么。当然可以进一步分解,手动base64编解码,手动创建hmac等等。
  • 我是初学者。我认为 jwt 是默认集成的,然后意识到它不是。我正在为这些步骤在 python 中搜索教程或更详细的信息。

标签: python jwt


【解决方案1】:

PyJWT

PyJWT 是一个 Python 库,可让您对 JSON Web 令牌 (JWT) 进行编码和解码。

安装:

pip install pyjwt

JWT认证教程可以在官方文档中找到。

【讨论】:

  • 我看到有很多 lof 库,但我想学习,不想使用任何库。我相信某处必须有纯 jwt 身份验证教程。
  • 浏览 GitHub 上库的源代码,您将了解如何在没有任何库的情况下实现它。 github.com/jpadilla/pyjwt
  • 我正在检查源代码,但对我来说似乎太复杂了。我只想生成 hs256 密钥我无法挑选出我需要的部分。一个教程或文档会很好。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我遇到了这个 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 
    

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多