我已经研究了各种方法,但是还没有找到最适合我的设置的方法。
我有一个调用api来向用户显示数据的UI,该UI不需要某人登录,并且我不想验证每个用户。我想做的只是保护api,因为使用api的网址,任何人都可以访问数据。
在我看来,我可以创建某种密码/ apikey并将其存储为环境变量,每当发出请求时,该变量就会从UI发送到API。在API上,在允许访问api之前会先验证该apikey /密码。
听起来不错吗?您还能提出其他建议吗?我错过了什么吗?欢迎所有想法。
解决方案对我来说听起来不错。您可以执行以下操作:
/api/get-token
),该端点将生成一个令牌(或ID),将其保存在本地(可能保存到DBMS中)并以以下形式返回:响应。然后,在需要保护的每个端点中,从请求中提取令牌,然后在发送任何“私有”数据之前,检查提供的令牌是否有效。localStorage
应该没问题)。然后,每次UI需要访问“私有”数据时,您只需在请求中提供声明。实现应该很简单。
您可以实现基于jwt令牌的机制来保护应用程序。首先,您需要编写一个api来验证用户是否被授权。例如/ api / login以获取jwt令牌(如果用户是有效用户)。
在您的前端应用程序中,每个请求都将jwt令牌作为Authrization头传递
Authorization : 'Bearer' + token
然后在后端应用程序中使用中间件功能来验证请求是否具有有效令牌。如果令牌无效,则发送401作为响应。如果有效,则处理请求。
下面提供的示例中间件,用于验证令牌以检查其是否有效。
app.use(tokenHandler);
const jwt = require("jsonwebtoken");
const constants = require("../constants");
let checkToken = (req, res, next) => {
let token = req.headers["x-access-token"] || req.headers["authorization"]; // Express headers are auto converted to lowercase
if (token && token.startsWith("Bearer ")) {
// Remove Bearer from string
token = token.slice(7, token.length);
}
if (token) {
jwt.verify(token, constants.SECRET, (err, decoded) => {
if (err) {
return res.status(401).send({
message: "Unauthorized"
});
} else {
next();
}
});
} else {
if (req.url === "/login") {
next();
} else {
return res.status(401).send({
message: "Unauthorized"
});
}
}
};