首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google网关用户身份验证

Google网关用户身份验证
EN

Stack Overflow用户
提问于 2021-11-08 01:01:01
回答 1查看 1.6K关注 0票数 0

我正在尝试通过Google网关中的JWTs来实现用户身份验证。

我已经按照文档在API配置中配置了安全需求对象和安全定义对象。

代码语言:javascript
运行
复制
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"
security:
   - google_id_token: []

后端服务是云运行服务

代码语言:javascript
运行
复制
x-google-backend:
  address: https://my-apis-fskhw40mta-uk.a.run.app

然而,当我用我的用户承载令牌调用API时,我会收到一个403错误,这个错误出现在堆栈驱动程序日志中。

代码语言:javascript
运行
复制
"jwt_authn_access_denied{Audiences_in_Jwt_are_not_allowed}"

调用API的Python客户端代码是

代码语言:javascript
运行
复制
id_token = subprocess.run(['gcloud', 'auth',  'print-identity-token'], capture_output=True, text=True, shell=True).stdout

http = urllib3.PoolManager()
encoded_args = urlencode({'arg1': "val1"})
r = http.request(
    'GET',
    API_URL + "/run-api?" + encoded_args,
    headers={"Authorization": f"Bearer {id_token}"}
)

当使用用户帐户(而不是服务帐户)时,有什么正确的方法包括听众?

更新1

我已经找到了一种方法来做这件事,但是我不确定它是否正确。如果我将32555940559.apps.googleusercontent.com添加到securityDefinitions中,则如下所示

代码语言:javascript
运行
复制
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://oauth2.googleapis.com/token, 32555940559.apps.googleusercontent.com"

它将允许未经身份验证的访问云运行,但我仍然不能调用云运行与身份验证启用。云运行返回403错误,原因是API网关服务帐户没有权限-它有Cloud Run Invoker

除了授予Cloud Run Invoker之外,我还需要做什么特殊的事情来使API调用云运行吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 05:51:11

不建议添加32555940559.apps.googleusercontent.com,因为这是默认的。理想情况下,每个服务的受众都应该是唯一的,这就是为什么我们通常会为此目的使用服务自己的URL。这样可以防止令牌被重复使用,例如被恶意或不安全的服务器重复使用,从而验证到其他期望不同受众的服务。

您可以指定在创建标识令牌时要使用的受众。例如:gcloud auth print-identity-token --audiences "https://service-acldswax.fx.gateway.dev"

您可以在x-google-audiences中指定相同的受众来完成这项工作。或者,以"https://“”为前缀的服务名称在默认情况下将被接受。这可以在API规范文件中指定为"host“,通常类似于"api.example.com”。

请注意,任何人都可以生成有效的身份令牌,网关将接受该令牌。网关正在执行/身份验证/,但不执行/授权/。您可以在应用程序中进行授权,也可以在私有API中使用不同的oauth2客户端。

当设置正确时,您应该能够连接到API网关,但您可能希望您的云运行服务被锁定,以防止网关被绕过。正如您所提到的,执行此操作所需的权限包含在“containing”角色中,这需要授予云运行服务中的网关的服务帐户(例如,项目、文件夹、组织)。

我建议运行以下命令来再次确认/检查设置:

  • 验证网关中的URL和API配置: gcloud网关网关描述$GATEWAY -location $REGION
  • 验证网关配置服务帐户和后端URL (以base64编码的document.contents):gcloud网关api-倾诉-api $API $API_CONFIG -视图完整
  • 验证云运行服务的权限: gcloud运行服务--区域$REGION get-iam-策略$SERVICE
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69877718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档