我正在尝试通过Google网关中的JWTs来实现用户身份验证。
我已经按照文档在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错误,这个错误出现在堆栈驱动程序日志中。
"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.com
添加到securityDefinitions
中,则如下所示
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调用云运行吗?
发布于 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”角色中,这需要授予云运行服务中的网关的服务帐户(例如,项目、文件夹、组织)。
我建议运行以下命令来再次确认/检查设置:
https://stackoverflow.com/questions/69877718
复制相似问题