为具有自定义身份验证的云端点创建承载令牌



我正在尝试将云端点配置为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网站。

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

当我尝试在我这边运行脚本时,我使用PyJWT模块用于import jwt部分,并在基于linux的操作系统上的Python 3.6.5上运行此模块。在运行了您列出的openssl命令,然后运行脚本之后,我最终得到了一个生成的JWT字符串,其中有两个点。

最新更新