当前位置: 首页 > 知识库问答 >
问题:

试图从云调度器调用用firebase-admin验证服务帐户?错误:Firebase ID令牌具有不正确的“ISS”(颁发者)声明

孔华池
2023-03-14

我试图验证从云调度器cron作业对服务器(在云运行时)进行的API调用

我想用一个服务帐户来做这个。

注意:这都发生在同一个项目中。

参考资料:

  • https://cloud.google.com/scheduler/docs/http-target-auth

这就是我正在做的:

我转到https://console.cloud.google.com/apis/credentials并创建了一个新的服务帐户。我已经将角色分配为owner

步骤2-创建cron作业。

我访问https://console.cloud.google.com/cloudScheduler,像往常一样创建cron作业。

service account字段中,我将我的服务帐户发送电子邮件。在vaturey字段中,我放入了我的项目id,因为在某个时候,我得到了一个错误,说它希望它是我的项目id的名称。

这是错误:

Firebase ID令牌有不正确的“AUD”(受众)声明。应为“project_id”

步骤3-运行作业并识别解码令牌:

这是我的服务器上的代码:

import * as admin from "firebase-admin";

admin.initializeApp({
  credential: admin.credential.cert(
    // THIS IS THE DEFAULT FIREBASE-ADMIN SERVICE ACCOUNT
    // THAT IS AUTOMATICALLY CREATED BY FIREBASE
    SERVICE_ACCOUNT as admin.ServiceAccount
)});

// THIS IS THE CODE THAT IS INSIDE MY SERVER TRYING TO VERIFY THE SERVICE ACCOUNT

try {
  const authHeader = req.headers.authorization;
  console.log(`authHeader: ${authHeader}`);
  if (authHeader) {
    const idToken = authHeader.split(" ")[1];   // GETS THE USER ID TOKEN
    const decodedToken = await admin.auth().verifyIdToken(idToken);
    console.log(`decodedToken: ${decodedToken}`);
  }
}

这是我目前得到的错误:

Firebase ID令牌有不正确的“ISS”(颁发者)声明。应为“https://securetoken.google.com/”my-project-id“,但得到了”https://accounts.google.com“。请确保ID令牌来自与用于验证此SDK的服务帐户相同的Firebase项目。有关如何检索ID令牌的详细信息,请参阅https://Firebase.google.com/docs/auth/admin/verify-id-tokens。

我做这件事的方式有什么问题吗?我不应该使用firebase-admin对此吗?

我应该使用google-auth-library来验证令牌吗?

  • https://github.com/googleapis/google-auth-library-nodejs#verifiing-id-tokens
  • https://developers.google.com/identity/sign-in/web/backend-auth

共有1个答案

严远
2023-03-14

经过一个上午的地狱般的调试,以下是我的发现。

似乎firebase-adminadmin.auth().verifyidToken()只适用于从firebaseSDK生成的令牌。

我通过直接使用google-auth-library使其工作。

我做了以下工作。

注意:代码的其余部分是相同的(使用与问题中描述的相同的服务帐户):

import { OAuth2Client } from "google-auth-library";

export const apiExpressRouteHandler: RequestHandler = async (req, res) => {
  try {

    const PROJECT_ID = process.env.PROJECT_ID;

    const authHeader = req.headers.authorization;
    if (authHeader) {
      const client = new OAuth2Client(PROJECT_ID);
      const ticket = await client.verifyIdToken({
        idToken: authHeader.split(" ")[1],
        audience: PROJECT_ID
      });

      // LOGGING ticket PROPERTIES

      console.log(`userId: ${JSON.stringify(ticket.getUserId())}`);
      console.log(`payload: ${JSON.stringify(ticket.getPayload())}`);
      console.log(`envelope: ${JSON.stringify(ticket.getEnvelope())}`);
      console.log(`attributes: ${JSON.stringify(ticket.getAttributes())}`);
    }

    // REST OF THE CODE
  }
} 
catch(err) {
  // ...
}

我不确定是否需要PROJECT_ID来用new OAuth2Client(PROJECT_ID)初始化客户机,但它是这样工作的。

 类似资料:
  • 在任何给定的POD中,服务帐户令牌被挂载在位置。 /var/run/secrets/kubernetes.io/serviceaccount/token 我想了解这个令牌是如何签名的。Kubernetes在签名此令牌时使用什么密钥?如何访问有助于脱机签名验证的公钥 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt-我尝试使用与此证书关联的公钥

  • 我的团队目前正在开发一个应用程序,使用Admin SDK在GCP中列出公司的域用户,用于入职和非入职目的。 我们使用一个服务帐户来完成这个任务,并且在Google Admin's advanced settings中添加了 作用域。管理SDK API被激活,我们可以在凭据区域中看到服务帐户。 当我们使用参数 和 调用https://www.googleapis.com/admin/director

  • 我正在使用Node js验证到Azure AD以创建Data Lake存储帐户,它会登录,但对于帐户创建,它会给出错误:代码:'Invalid验证令牌租户',消息:'访问令牌来自错误的发行者\'https://sts.windows.n et\'。它必须匹配与此子描述关联的租户\'https://sts.windows.net/\'。

  • 我的网站有一个问题。结帐时,我得到内部服务器错误。我已经阅读了论坛上甚至这个论坛上提供的几乎所有解决方案,但没有一个被证明能解决这个问题。下面是错误日志。 注意:id调用不正确。不应直接访问订单属性。回溯:require('wp-blog-header.php')、require_once('wp-includes/template loader.php')、include('/themes/as

  • 我正在尝试使用API将成员添加到组中。我在谷歌脚本工具中编写代码,但是,我收到了错误消息: 我已经在G套件域中添加了作用域,我已经创建了服务帐户、API密钥、OAuth 2.0密钥。我的要求是: 遗漏了什么,或者我做错了什么?我已经阅读了所有的文档,仍然不知道出了什么问题。

  • 最近更改了azure订阅,我需要在azure DevOps–服务连接中添加相同的订阅。当尝试为更改的订阅创建新的服务连接时,我发现以下错误- 查询服务连接API失败:'https://management.azure.com/subscriptions/{id}/resourcegroups? api- 版本=2016-02-01'。状态代码:“未经授权”,来自服务器的响应:“{”错误“{”代码“