Python 使用自定义身份验证为云端点创建承载令牌
我正在尝试将云端点配置为GKE的前端。作为其中的一部分,我正在手动尝试创建jwt。但当我尝试将其用作承载令牌时,我得到以下响应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
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-你说得对,我搞砸了。如果你把你的评论变成一个答案,我不会接受任何问题!我希望现在一切都如预期的那样顺利!如果需要在答案中添加更多内容,请告诉我:)