Python 使用自定义身份验证为云端点创建承载令牌

Python 使用自定义身份验证为云端点创建承载令牌,python,jwt,google-cloud-endpoints,Python,Jwt,Google 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, err

我正在尝试将云端点配置为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规范中引用了它,但我很确定这与我的错误无关


有关于我做错了什么的线索吗?

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

错误表明
错误的JWT格式:应该有2个点
使问题看起来可能与令牌字符串本身有关。JWT字符串通常应该有两个点,我认为格式通常是这样的:
header.payload.verify_signature

如果您的令牌字符串中没有两个点,则可能缺少部分令牌字符串,可能需要使用脚本重新生成


当我尝试在我这边运行您的脚本时,我使用了导入jwt部分的模块,并在基于Linux的操作系统上的Python3.6.5上运行了该模块。运行列出的openssl命令,然后运行脚本后,我得到了一个生成的JWT字符串,其中有两个点。

查看此错误:
错误的JWT格式:应该有两个点
,根据过去的经验,我认为JWT令牌字符串的格式通常类似于
first.second.third
。您的令牌字符串看起来不同吗?(出于安全原因,我建议暂时不要在您的问题中发布您的实际令牌字符串。)从它看来,这些部分可能与
header.payload有关。请验证\u签名
。另外,您是否对
jwt
模块部分使用
PyJWT
?当我在基于Linux的操作系统上使用Python 3.6.5运行Python脚本(在运行openssl命令之后),我会得到一个包含两个点的生成令牌。@summea-你说得对,我搞砸了。如果你把你的评论变成一个答案,我不会接受任何问题!我希望现在一切都如预期的那样顺利!如果需要在答案中添加更多内容,请告诉我:)