Google Cloud API Gateway JWT用户认证及Cloud Run调用403问题咨询
问题1:用户账户(非服务账号)JWT的audience正确配置方式
你遇到的Audiences_in_Jwt_are_not_allowed报错是因为API Gateway的JWT校验逻辑要求请求携带的ID token的aud(受众)声明必须和你在securityDefinitions中配置的x-google-audiences值完全匹配,正确配置流程如下:
- 第一步:生成用户ID token时显式指定audience,不要使用gcloud默认生成的aud值。调用
gcloud auth print-identity-token时添加--audiences参数,参数值设为你的API Gateway的访问根地址(例如你API Gateway的对外地址是https://my-gateway-abcdef.uc.gateway.dev,就填这个地址)。
对应你提供的Python客户端代码,修改生成ID token的命令即可:# 把你的API Gateway地址填到--audiences参数里 id_token = subprocess.run( ['gcloud', 'auth', 'print-identity-token', '--audiences=https://my-gateway-abcdef.uc.gateway.dev'], capture_output=True, text=True, shell=True ).stdout.strip() # 必须加strip()去掉末尾换行符,避免token无效 - 第二步:在API配置的securityDefinitions中添加
x-google-audiences字段,值和你刚才指定的audience保持一致:securityDefinitions: google_id_token: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "https://accounts.google.com" x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs" x-google-audiences: "https://my-gateway-abcdef.uc.gateway.dev" # 和生成token时指定的aud完全一致
你之前添加
32555940559.apps.googleusercontent.com的方案是临时适配gcloud默认aud的方式,这个ID是Google Cloud SDK的默认客户端ID,这种配置会允许所有使用gcloud默认生成ID token的用户调用你的API,权限管控风险较高,不推荐生产环境使用。
问题2:开启Cloud Run认证后仍返回403的解决方案
哪怕你已经给API Gateway服务账号授予了Cloud Run Invoker权限,API Gateway默认不会自动为发往后端Cloud Run的请求附加合法的认证token,Cloud Run的身份校验会直接拒绝请求,需要补充以下配置:
在x-google-backend配置段中添加jwt_audience字段,值为你的Cloud Run服务的对外地址,示例配置:
x-google-backend: address: https://my-apis-fskhw40mta-uk.a.run.app jwt_audience: https://my-apis-fskhw40mta-uk.a.run.app # 和Cloud Run服务地址完全一致
补充两个注意点:
- 确认你授权Cloud Run Invoker权限的服务账号是对应API Gateway的官方服务账号,格式为
<网关名称>@<项目ID>.iam.gserviceaccount.com,不要错用其他服务账号 - API Gateway完成用户JWT校验后,会自动将转发到Cloud Run的请求的Authorization头替换为自身服务账号生成的、以Cloud Run地址为aud的ID token,无需手动处理;如果需要在Cloud Run侧获取请求用户的身份信息,可以读取请求头中
X-Apigateway-Api-Userinfo字段,该字段是API Gateway转发的用户JWT的payload部分,经Base64编码后的值。
内容的提问来源于stack exchange,提问作者rossco
相关产品推荐
相关产品推荐

