【问题标题】:Decoding Firebase ID token failed解码 Firebase ID 令牌失败
【发布时间】:2021-09-12 14:14:37
【问题描述】:

我正在尝试将我的 API 限制为仅登录用户。为此,我将发送 firebase 令牌并尝试在服务器端验证 Google says 的确切操作方式。

但是,我遇到了这样的异常:

FirebaseAuthError: Decoding Firebase ID token failed. Make sure you passed the entire string JWT which represents an ID token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.

在客户端和服务器端打印出这些令牌证明它们是相同的。

我错过了什么吗?

我的代码:

const checkAuth = (token) => {
  if (token === undefined) return false;
  console.log(token);
  admin
    .auth()
    .verifyIdToken(token)
    .then((decodedToken) => {
      const uid = decodedToken.uid;
      admin
        .auth()
        .getUser(uid)
        .then(() => {
          return true;
        })
        .catch(() => {
          return false;
        });
    })
    .catch((error) => console.log(error));
};

// example usage

app.get("/fileslist/:id", async function (req, res) {
  const authorized = checkAuth(req.headers.token);
  if (authorized) {
    const directoryPath = path.join(__dirname, "uploads/" + req.params.id);
    fs.readdir(directoryPath, function (err, files) {
      var array = [];
      if (err) {
        return console.log("Unable to scan directory: " + err);
      }
      files.forEach(function (file) {
        array.push(file);
      });
      res.status(200).send(array);
    });
  } else {
    res.status(403).send();
  }
}); 

和客户端:

//getting token
const getToken = () => {
    currentUser
      .getIdToken(true)
      .then(function (idToken) {
        setToken(idToken);
      })
      .catch((error) => {
        console.log(error);
      });
  };

//calling an api
const getFilesById = async (id, token) => {
  console.log(token);
  return await client.get(
    "/fileslist/" + id,
    {},
    { headers: { token: token } }
  );
};

//api definition
import { create } from "apisauce";

const api = create({
  baseURL: "http://localhost:3005",
});

export default api;

【问题讨论】:

  • 你在哪里打电话给getFilesById?你是如何传递令牌的?
  • @Dharmaraj getFilesById 在 React 的 useEffect 中被调用,我将令牌作为参数传递
  • 您能否确认令牌已正确记录在 console.log 中?
  • @Dharmaraj 正如我在客户端和服务器端所说的那样,令牌被打印到控制台并且是相同的

标签: reactjs firebase express firebase-authentication


【解决方案1】:

需要在checkAuth()函数中返回整个Promises chain,如下:

const checkAuth = (token) => {
  if (token === undefined) return false;
  console.log(token);
  return admin  // <== see return
    .auth()
    .verifyIdToken(token)
    .then((decodedToken) => {
      const uid = decodedToken.uid;
      return admin  // <== see return
        .auth()
        .getUser(uid)
        .then(() => {
          return true;
        })
        .catch(() => {
          return false;
        });
    })
    .catch((error) => console.log(error));
};

您实际上可能只有一个 catch 块,如下所示:

  const checkAuth = (token) => {
    if (token === undefined) return false;
    console.log(token);
    return admin // <== see return
      .auth()
      .verifyIdToken(token)
      .then((decodedToken) => {
        const uid = decodedToken.uid;
        return admin // <== see return
          .auth()
          .getUser(uid);
      })
      .then(() => {
        return true;
      })
      .catch((error) => {
        console.log(error);
        return false;
      });
  };

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 2020-05-27
    • 2021-09-28
    • 2018-01-31
    • 1970-01-01
    • 2020-03-12
    • 2019-06-27
    相关资源
    最近更新 更多