使用自定义身份验证为 Cloud Endpoints 创建不记名令牌

问题描述

我正在尝试将 Cloud Endpoints 配置为 GKE 的前端。作为其中的一部分,我正在手动尝试创建一个 jwt。但是当我尝试将它用作不记名令牌时,我得到以下响应。

HTTP/1.1 401 Unauthorized
Connection: keep-alive
Content-Type: application/json
Date: Mon,08 Feb 2021 16:28:06 GMT
Server: Nginx
transfer-encoding: chunked
WWW-Authenticate: Bearer,error="invalid_token"

{
    "code": 16,"details": [
        {
            "@type": "type.googleapis.com/google.rpc.DebugInfo","detail": "auth","stackEntries": []
        }
    ],"message": "JWT validation Failed: Bad JWT format: should have 2 dots"
}

我使用 openssl 创建了一个私钥和公钥

openssl genrsa -out jwt-key 4096
openssl rsa -in jwt-key -pubout > jwt-key.pub

然后我使用 Python 来创建 JWT 本身

import jwt
import datetime

private_key = open('jwt-key').read()
#public_key = open('jwt-key.pub').read()

aud = 'https://echo.api.some.com'
payload = {
    'iss': 'iss','sub': 'sub','aud': aud,'iat': datetime.datetime.utcNow(),'exp': datetime.datetime.utcNow() + datetime.timedelta(days=30)
}

token = jwt.encode(payload,private_key,algorithm='RS256')
print(token)

我使用上述 Python 脚本的输出作为我的 http 授权标头的参数

Authorization: Bearer $TOKEN

我还将公钥上传到存储桶并在我的 openapi 规范中引用了它,但我很确定这与我的错误无关。

任何关于我做错了什么的线索?

解决方法

根据你的评论和我之前的评论:

显示 Bad JWT format: should have 2 dots 的错误使问题看起来可能与令牌字符串本身有关。 JWT 字符串中通常应该有两个点,我认为格式通常如下所示:header.payload.verify_signature 根据 jwt.io website 上的示例。

如果您的令牌字符串中没有两个点,则可能是令牌字符串的一部分丢失了,可能需要使用您的脚本重新生成。

当我尝试在我这边运行您的脚本时,我将 PyJWT 模块用于 import jwt 部分,并在基于 Linux 的操作系统上的 Python 3.6.5 上运行它。运行您列出的 openssl 命令并运行您的脚本后,我最终生成了一个包含两个点的 JWT 字符串。