【发布时间】: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