谷歌通过节点(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

仅使用 Facebook 令牌在 iOS 上发送 Firebase 邀请登录 Firebase 身份验证

如何从 firebase_auth 获取令牌

如何在节点 js 的服务器端验证谷歌身份验证令牌?

在Firebase中创建用户后获取身份提供商令牌