firebase使用admin sdk的服务帐户验证请求

q1qsirdb  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(123)

我尝试使用后台生成的令牌对来自第三方的服务器应用程序进行身份验证,该令牌是使用admin SDK和服务帐户生成的。出于测试目的,我尝试使用Postman进行请求。我确实通过添加Authorization作为头密钥并将值添加为Bearer [token],将生成的令牌放在Postman请求的头中。不幸的是,在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都很陌生,所以如果我的描述缺乏信息,很抱歉。

y0u0uwnf

y0u0uwnf1#

错误消息告诉你,你不能使用verifyIdToken()来验证自定义令牌,所以你正在尝试的东西永远不会工作。该函数用于验证来自用户登录的Web或移动的应用的用户ID令牌。
如果您已经为用户生成了自定义令牌,则需要使用该令牌使用signInWithCustomToken()在客户端应用中使用Firebase Auth登录用户,然后,您可以使用getToken()获取用户的ID令牌。只有该令牌才能传递到后端并使用verifyIdToken()进行验证。

相关问题