我有一个云运行的应用程序,我可以使用通过终端调用它
curl -H
"Authorization: Bearer $(gcloud auth print-identity-token)"
https://url.run.app
我还有一个云功能,我想调用它https://url.run.app并且我需要通过gcloud auth-print标识令牌提供的承载令牌。
对于同一个帐户,我希望始终使用相同的令牌。例如,下面的代码为我提供了运行firebase的私有和帐户。(我的firebaseadmin帐户(。我可以获得一个适用于云运行的Bearer代币吗
const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();
await auth.getCredentials()
有没有办法获得身份令牌?
通过评论总结John Hanley的解决方案:
有一项是必须执行的,而CLI不需要执行。那就是指定OIDC标识令牌访问群体。该值是您正在调用的服务的URL。如果您知道如何编写HTTP GET请求,请在Cloud Functions:内执行时复制此请求
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE"
-H "Metadata-Flavor: Google"
其中,AUDIENCE
是您正在调用的服务的URL(即https://TARGET_HOSTNAME/
(。
getIdTokenClient
不会按照您的想法返回Bearer令牌。它返回一个OIDC身份令牌,这正是您想要的。Bearer是一种HTTP身份验证方案,支持许多不同的令牌类型。文档中有一些示例供您使用。
示例演示代码:
'use strict';
function main(
url = 'https://service-1234-uc.a.run.app',
targetAudience = null
) {
if (!targetAudience) {
// Use the target service's hostname as the target audience for requests.
// (For example: https://my-cloud-run-service.run.app)
const {URL} = require('url');
targetAudience = new URL(url).origin;
}
// [START google_auth_idtoken_serverless]
// [START cloudrun_service_to_service_auth]
// [START run_service_to_service_auth]
// [START functions_bearer_token]
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// Example: https://my-cloud-run-service.run.app/books/delete/12345
// const url = 'https://TARGET_HOSTNAME/TARGET_URL';
// Example (Cloud Run): https://my-cloud-run-service.run.app/
// Example (Cloud Functions): https://project-region-projectid.cloudfunctions.net/myFunction
// const targetAudience = 'https://TARGET_HOSTNAME/';
const {GoogleAuth} = require('google-auth-library');
const auth = new GoogleAuth();
async function request() {
console.info(`request ${url} with target audience ${targetAudience}`);
const client = await auth.getIdTokenClient(targetAudience);
const res = await client.request({url});
console.info(res.data);
}
request().catch(err => {
console.error(err.message);
process.exitCode = 1;
});
// [END functions_bearer_token]
// [END run_service_to_service_auth]
// [END cloudrun_service_to_service_auth]
// [END google_auth_idtoken_serverless]
}
const args = process.argv.slice(2);
main(...args);
以下内容在我们的终端上起作用-也使用Axios测试和验证了令牌。
const {GoogleAuth} = require('google-auth-library');
const targetAudience = 'https://my-cloud-run.nn.a.run.app/'
const auth = new GoogleAuth();
const client = await auth.getIdTokenClient(targetAudience)
const idToken = await client.idTokenProvider.fetchIdToken(targetAudience);