Google Cloud API网关用户身份验证



我正在尝试通过Google Cloud API网关中的JWT实现用户身份验证
我已经根据文档在API配置中配置了安全需求对象和安全定义对象

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: []

后端服务是云运行服务

x-google-backend:
address: https://my-apis-fskhw40mta-uk.a.run.app

然而,当我用我的用户承载令牌调用API时,我收到一个403错误,这个错误在stackdriver日志中

"jwt_authn_access_denied{Audiences_in_Jwt_are_not_allowed}"

调用API的Python客户端代码是

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.comsecurityDefinitions,所以它看起来像这个

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"

它将允许未经身份验证的访问Cloud Run,但我仍然无法在启用身份验证的情况下调用Cloud Run。由于API网关服务帐户没有权限,Cloud Run返回403错误-它有Cloud Run Invoker

除了授予Cloud Run Invoker之外,我是否需要做一些特殊的事情来启用API网关调用云运行

不建议添加32555940559.apps.googleusercontent.com,因为这是默认设置。理想情况下,每个服务的受众都应该是唯一的,这就是为什么我们通常使用服务自己的URL来实现这一目的。这防止了令牌被重用,例如被恶意或不安全的服务器重用,以向期望不同受众的其他服务进行身份验证。

您可以在创建身份令牌时指定要使用的访问群体。例如:gcloud auth print-identity-token --audiences "https://service-acldswax.fx.gateway.dev"

您可以在x-google-audiences中指定相同的访问群体来实现此功能。或者,前缀为";https://";将默认接受。这可以被指定为";主机";在API规范文件中,并且通常是类似于;api.example.com";。

请注意,任何都可以生成一个有效的身份令牌,该令牌将被网关接受。网关正在执行/authentication/,但未执行/authorification/。您可以在应用程序中进行授权,或者对于私人API,您可能希望使用不同的oauth2客户端。

正确设置后,您应该能够连接到API网关,但您可能希望锁定云运行服务,以防止网关被绕过。正如你所提到的,这样做所需的许可包括在";云运行调用程序";角色,这需要授予网关在云运行服务上的服务帐户,云运行服务是其包含的资源之一(例如项目、文件夹、组织(。

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

  • 验证网关中的URL和API配置:gcloud API-gateway网关描述$gateway--位置$REGION
  • 验证网关配置服务帐户和后端URL(在base64编码的document.contents中(:gcloud api-gateway api-configs describe--api$neneneba api$api_config--view FULL
  • 验证对云运行服务的权限:gcloud运行服务--区域$region获取iam策略$service

相关内容

最新更新