我正在尝试为学校项目构建MERN堆栈Food Tracker应用程序,我对MERN堆栈还很陌生,并且遇到了使服务器的Express路由私有化的问题,能够通过搜索找到解决方案。
我已经使用Auth0设置了登录功能。我的路线和模型存储在单独的文件中,而我的checkJwt中间件存储在要导入到我的路线文件中的单独文件中。我也在用cors。我已经通过将前端的请求发送到直接写入到server.js文件中的路由来测试所有设置是否正确,以便进行身份验证,并且还验证了当路由公开时我的路由会响应前端,但是当我尝试将自己的路线设为私有路线时,会出现401未经授权的错误。
checkJwt文件:
const jwksRsa = require("jwks-rsa");
require("dotenv").config();
const audience = process.env.AUTH0_AUDIENCE;
const issuer = process.env.AUTH0_ISSUER;
module.exports = checkJwt = jwt({
secret: jwksRsa.expressJwtSecret({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: `${issuer}.well-known/jwks.json`,
}),
audience: audience,
issuer: issuer,
algorithms: ["RS256"],
});
Server.js设置:
app.use(cors({ origin: appOrigin }));
app.options("*", cors());
const profile = require("./backend/routes/profile");
//Test Route
app.get("/api/messages", checkJwt, (req, res) => {
res.send({
msg: "Testing authentication.",
});
});
// External route
app.use("/routes/profile", profile);
profile.js-路由文件:
//Import checkJwt
const checkJwt = require("../../config/checkjwt");
//Import model
const Profile = require("../models/Profile");
//Router
router.post("/update/:user_id", checkJwt, (req, res, next) => {
//Code to update user information in database//
});
而且,以防万一可能有用,我正在使用axios在前端发出请求。这是该代码:
const onSubmit = async () => {
try {
const token = await getAccessTokenSilently();
const response = await axios.post(
`${apiUrl}routes/profile/update/${sub}`,
{
data: qs.stringify({
username: username,
}),
headers: {
Authorization: `Bearer ${token}`,
},
}
);
setMessage(response.data);
} catch (error) {
setMessage(error.message);
}
};
我尝试重写请求,将其转换为Promise,但是由于该请求在路由公开后才有效,因此我可以发出直接写入到server.js中的私有路由请求,我怀疑问题出在我访问这些外部路由的方式中。任何帮助将不胜感激。
*编辑:我今天早上意识到,我的测试路线和问题路线之间还有另一个我没有考虑的巨大差异。测试路由是GET路由,问题路由是POST。当我在profile.js路由文件中更改我的GET路由之一以包括checkJwt时,它工作正常。所以问题是我不能开机自检。现在正在研究此问题,但是关于如何专门设置POST路由或它们与GET路由的区别还不多。
我从Auth0网站上查看了本教程,该网站使用的是Passport策略:https://auth0.com/blog/create-a-simple-and-secure-node-express-app/#Accessing-Guarded-Routes 但我认为护照与checkJwt相同...只是使用不同的中间件来完成相同的事情。我误会了吗?
我最初是按照本教程设置所有内容的:https://auth0.com/blog/complete-guide-to-react-user-authentication/
我还查看了有关权限和范围的Auth0快速入门:https://auth0.com/docs/quickstart/backend/nodejs/01-authorization 听起来好像没有添加作用域或权限,并且像没有作用域的私有对象那样进行设置可以允许对路由的完全访问,但是现在我想知道是否需要为发布设置这些权限...但是有关其工作原理的文档很少。
任何人都可以指出我的安全和访问我的POST路由的更好教程的方向吗?