Firebase 通过 Admin SDK 使用服务帐号对请求进行身份验证

firebase authenticating requests using service account with admin sdk

提问人:Schorsch 提问时间:11/17/2023 最后编辑:Doug StevensonSchorsch 更新时间:11/17/2023 访问量:30

问:

我正在尝试使用带有服务帐户的管理 SDK 在后端生成的令牌对来自第三方的服务器应用程序进行身份验证。出于测试目的,我尝试使用 Postman 来处理请求。我确实通过将 Authorization 添加为值为 Bearer [token] 的标头键,将生成的令牌放在邮递员请求的标头中。 不幸的是,在Firebase日志资源管理器中查找时,我收到错误:

verifyIdToken() 需要一个 ID 令牌,但被赋予了一个自定义令牌

这是用于创建令牌的代码:



const admin = require("./firebaseInit");
const uid = "test";

const generateToken = async (req, res) => {
  try {
    // Validation logic
    const isValidService = true; // add more later(testing only)

    if (!isValidService) {
      return res.status(403).json({error: "Invalid service or application"});
    }

    // Set CORS headers
    res.set("Access-Control-Allow-Origin", "https://omnibill-twl.web.app");
    res.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    res.set("Access-Control-Allow-Headers",
        "Origin, Content-Type, Accept, Authorization");


    // Generate a token
    const customToken = await admin.auth().createCustomToken(uid);
    console.log("Custom Token:", customToken);
    res.json({oneTimeToken: customToken});
  } catch (error) {
    console.error("Error generating one-time token:", error);
    res.status(500).json({error: "Internal Server Error"});
  }
};

module.exports = {generateToken};

这是获取令牌的代码:

const authHeader = req.header("Authorization");
    const idToken = authHeader ? authHeader.split("Bearer ")[1] : null;

这是它失败并出现错误的行:

// Verify the token
    const decodedToken = await admin.auth().verifyIdToken(idToken);

我尝试在 https://jwt.io/ 上检查生成的令牌,它指出签名无效。 我不知道为什么,因为我使用了 admin sdk,并且它应该在创建新密钥后使用我从 Firebase 下载的 JSON 文件中的私钥自动对其进行签名。 我仔细检查了收到的密钥是否与创建的密钥相同,并且它们是否匹配。 总的来说,我对 Firebase 和 JS 很陌生,如果我的描述缺少信息,很抱歉。

javascript firebase jwt firebase-admin

评论


答:

0赞 Doug Stevenson 11/17/2023 #1

错误消息告诉您,您不能用于验证自定义令牌,因此您正在尝试的操作将永远无法正常工作。该函数用于验证来自用户登录的 Web 或移动应用程序的用户 ID 令牌。verifyIdToken()

如果您已为用户生成了自定义令牌,则需要使用该令牌通过 Firebase Auth 在客户端应用中使用 登录用户,然后,您可以使用 获取用户的 ID 令牌。只有该令牌才能传递到后端并使用 进行验证。signInWithCustomToken()getToken()verifyIdToken()

评论

0赞 Schorsch 11/20/2023
嘿道格,非常感谢您的帮助。我能够生成一个自定义令牌并使用 jsonwebtoken 的解码函数对其进行验证。