我有一个由JWT令牌认证的公共云运行。100%工作。云中解码令牌的逻辑在python中:
def decode_jwt(token: str) -> dict:
try:
decoded_token = jwt.decode(
token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
return decoded_token if decoded_token["expires"] >= time.time() else None
except Exception as e:
raise InvalidTokenError云运行可以使用自定义域公开使用。
现在,我想使用云任务对云运行执行一些请求(每个请求都有不同的参数,以前由一个云函数创建)。在云任务中,我使用"Bearer {token}“参数创建每个任务
云任务标题代码:
task["http_request"]["headers"] = \
{"Authorization": f"Bearer {token}",
"Accept": "application/json"}第一种情况:
当我在创建oidc_token时不使用“http_request”参数创建任务时。云运行返回"403禁忌“,并且永远不会到达云运行中的decode_jwt函数。云任务http_request代码:
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
"url": url,
}
}第二种情况:我添加了一个"oidc_token“。
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
"url": url,
"oidc_token": {
"service_account_email": "service-task@xxxxx.iam.gserviceaccount.com",
}
}现在,请求到达Cloud decode_jwt函数,Cloud中的日志返回"InvalidTokenError“。额外:我添加了一个logging.info来公开在云运行中接收到的令牌,而不是我在Cloud创建中传递的令牌。
发布于 2022-02-24 01:11:29
问题摘要:
管理。
云运行服务的授权由身份感知代理(IAP)管理。如果添加HTTP授权承载令牌,IAP将验证该令牌。该步骤对于您的自定义令牌失败,这将导致HTTP 403禁止错误。
云任务支持两种类型的HTTP授权承载令牌。OAuth访问令牌和OIDC标识令牌。不能使用自己的令牌值替换受支持的类型。
这给你留下了两个选择:
注意:我不建议使用HS256。HS256是一种对称算法,它意味着为了验证有效载荷,双方都必须知道秘密。RS256是一种使用私钥对和公钥对的非对称算法。要验证,只需要公钥。这是Google将私钥用于服务帐户和身份的强大设计特性之一。如果你切换到谷歌的方法,所有的辛苦工作都是为你做的。
发布于 2022-02-23 19:42:26
您必须指定云运行服务的受众,就像这样
task = {
"http_request": { # Specify the type of request.
"http_method": tasks_v2.HttpMethod.POST,
"url": url, # The full url path that the task will be sent to.
"oidc_token": {
"service_account_email": "service-task@xxxxx.iam.gserviceaccount.com",
"audience": base url of Cloud Run, no /sub/path
}
}https://stackoverflow.com/questions/71242988
复制相似问题