谷歌通过节点(firebase)获取身份令牌
Posted
技术标签:
【中文标题】谷歌通过节点(firebase)获取身份令牌【英文标题】:Google obtain identity token through node (firebase) 【发布时间】:2022-01-22 12:41:47 【问题描述】:我有一个可以通过终端调用的云运行应用程序:
curl -H \
"Authorization: Bearer $(gcloud auth print-identity-token)" \
https://url.run.app
我还有一个云功能,我想让它调用https://url.run.app,我需要通过 gcloud auth print-identify-token 提供的不记名令牌。
我希望同一帐户始终使用相同的令牌。例如,以下代码为我提供了运行 firebase 的私有和帐户。 (我的 firebaseadmin 帐户)。我能否获得适用于云运行的 Bearer 令牌
const GoogleAuth = require('google-auth-library');
const auth = new GoogleAuth();
await auth.getCredentials()
有没有办法获取身份令牌?
【问题讨论】:
不清楚你在问什么。这是什么意思调用是通过第三方模块完成的,所以我不能使用来自 google-auth-library 的客户端模型。? 您混淆了 HTTP 身份验证方案(承载)和 OIDC 身份令牌。 Google 已经发布了多种语言的示例。编辑您的问题并准确说明您需要做什么。此答案可能是您正在寻找的一个示例:***.com/a/67122583/8016720 此链接提供有关基础知识的详细信息:developers.google.com/identity/protocols/oauth2 试试这个链接:cloud.google.com/run/docs/authenticating/… 有一项您必须执行的操作,而 CLI 不需要执行此操作。即指定 OIDC 身份令牌受众。该值是您正在调用的服务的 URL。如果您知道如何编写 HTTP GET 请求,请在 Cloud Functions 中执行时重现此内容:curl "metadata.google.internal/computeMetadata/v1/instance/…" -H "Metadata-Flavor: Google" getIdTokenClient 不会按照您的想法返回 Bearer 令牌。它返回您想要的 OIDC 身份令牌。 Bearer 是一种 HTTP 身份验证方案,支持多种不同的令牌类型。现在我知道您需要 Node.js,文档中有示例供您使用:github.com/googleapis/google-auth-library-nodejs 示例演示代码:github.com/googleapis/google-auth-library-nodejs/blob/main/… 【参考方案1】:通过评论总结 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 身份验证方案,支持许多不同的令牌类型。 documentation 有示例供您使用。
例如demo code:
'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);
【讨论】:
以上是关于谷歌通过节点(firebase)获取身份令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Firebase Google 身份验证获取带有刷新令牌的 YouTube 数据 API 访问令牌?
Firebase:通过 REST 获取令牌并使用 signInWithCustomToken