firebase 使用管理 sdk 的服务帐户对请求进行身份验证

问题描述 投票:0回答:1

我正在尝试使用带有服务帐户的管理 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 firebase-authentication jwt firebase-admin
1个回答
0
投票

错误消息告诉您无法使用

verifyIdToken()
来验证自定义令牌,因此您尝试的操作永远不会起作用。该函数用于验证来自用户登录的网络或移动应用程序的用户 ID 令牌。

如果您为用户生成了自定义令牌,则需要使用该令牌通过 Firebase Auth 使用

signInWithCustomToken()
在客户端应用程序中登录用户,之后,您可以使用
 获取用户的 ID 令牌getToken()
。您只能将该令牌传递到后端并使用
verifyIdToken()
进行验证。

© www.soinside.com 2019 - 2024. All rights reserved.