使用自定义身份验证为 Cloud Endpoints 创建持有者令牌

Create bearer token for Cloud Endpoints with custom authentication

我正在尝试将 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

创建了一个私钥 public
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 授权的参数 header

Authorization: Bearer $TOKEN

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

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

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

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

上的示例

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

当我在我这边尝试 运行 你的脚本时,我在 import jwt 部分使用了 PyJWT 模块,在 Python 3.6 上使用了 运行 .5 在基于 Linux 的 OS 上。在 运行 你列出的 openssl 命令然后 运行 你的脚本之后,我最终得到了一个生成的 JWT 字符串,其中有两个点。