我正在尝试将 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 规范中引用了它,但我很确定这与我的错误无关。
任何关于我做错了什么的线索?
答案 0 :(得分:2)
根据你的评论和我之前的评论:
显示 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 字符串。