使用自定义身份验证为 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 字符串,其中有两个点。
我正在尝试将 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
创建了一个私钥 publicopenssl 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 字符串,其中有两个点。