【发布时间】:2021-10-28 10:42:02
【问题描述】:
现在是周末,所以我正在尝试一些新的东西 - 目标是让 Web 应用程序使用用户的凭据连接到 GCP api,并且(对于初学者)让他们选择一个项目并列出他们的计算资源(比如说网络)。我想要走的路是客户端的JS客户端+ oauth2。
我从这里https://developers.google.com/identity/protocols/oauth2/javascript-implicit-flow#example 选择了 JS 客户端“完整示例” 注册了我的应用,修改了id/secret,将范围改为“https://www.googleapis.com/auth/cloud-platform.read-only https://www.googleapis.com/auth/compute.readonly"
现在,如果我只是硬编码项目并列出网络,它就可以正常工作。
但只要我尝试提出如下请求:
var request = gapi.client.request({
'method': 'GET',
'path': 'https://cloudresourcemanager.googleapis.com/v1/projects'
})
甚至 (!) 将“https://cloudresourcemanager.googleapis.com/$discovery/rest?version=v1”添加到 discoveryDocs - 我收到 400 错误“API 密钥无效。请传递有效的 API 密钥。”
我尝试了不同的范围,包括 API Explorer 中提到的最广泛的https://www.googleapis.com/auth/cloud-platform,但无济于事。我显然可以列出我可用的项目,并且通过 api explorer 进行相同的查询工作正常。
知道我错过了什么吗?
【问题讨论】:
-
你需要在header中添加一个“Authorization: Bearer
”。 API 身份验证已弃用。您可以使用您的用户凭据生成此令牌 -
谢谢,但是...我使用 JS 客户端,所以我不直接控制标题。另外,我不想使用我的凭据,我想使用使用该应用程序的用户的访问权限。
-
我似乎被这个例子误导了,它要求调用 gapi.client.init() 并使用 clientId 和 apiKey 模糊地将其链接到创建授权凭据。所以(不幸的是,没有想太多)我用 client_id 和 client_secret 填充它,这使得 gapi.client 使用提供的 apiKey 作为...... API 密钥(这并不奇怪)。令人惊讶的是,它适用于计算,但不适用于 cloudresourcemanager。在 client.init() 中不提供 apiKey 似乎可以解决问题,但我需要更多时间阅读和验证以在此处提供自我回答。
-
在 gapi.client.init() 中,如果您同时提供 apiKey 和 client_id 值,您是否获得了预期的输出?
-
cloudresourcemanager API 不支持 API 密钥。您必须使用从用户或服务帐户派生的 OAuth 2.0 访问令牌。
标签: google-cloud-platform google-oauth google-api-js-client