【发布时间】:2021-04-28 15:37:51
【问题描述】:
我在设置 csrf 时遇到问题。我希望有人能指出我正确的方向。
我将 next.js 与 express.js 一起使用。
当我刷新页面时,会发生以下情况:
- 我得到一个 _csurf cookie(开发工具 > 应用程序 > cookie)
- 在我的控制台中记录了一个 csrf 令牌(-> 查看从上下文中截取的最后一个代码)
- 当我发出 POST 请求时(-> 参见 routes/index.js f.ex.“/aignupQ”),我收到错误“Invalid csurf token”;在请求标头中,我可以看到 _csrf cookie
- 当我刷新页面并再次发出 POST 请求时,一切正常。
我真的被这个错误弄糊涂了,真的不明白哪里出了问题。以下是一些相关代码:
server.js:
require("dotenv").config();
const express = require("express");
const next = require("next");
const bodyParser = require("body-parser");
const cors = require("cors");
const cookieParser = require("cookie-parser");
const routes = require('./routes');
const csrf = require("csurf");
const csrfProtection = csrf({
cookie: true,
});
//next.js configuration
const dev = process.env.NODE_DEV !== "production";
const nextApp = next({ dev });
const port = 3000;
const handle = nextApp.getRequestHandler();
nextApp.prepare().then(() => {
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
app.use(cookieParser());
app.use((err, req, res, next) => {
res.status(500).send("Something went wrong!");
});
app.use(csrfProtection);
app.use('/api', routes);
app.get("*", (req, res) => {
return handle(req, res);
});
//start server
app.listen(port, (err) => {
if (err) throw err;
console.log(`listening on port ${port}`);
});
});
路由/index.js:
const express = require('express')
const router = express.Router()
const getCsrfToken = require('../controllers/csrf')
const postSignupQ = require("../controllers/postSignupQ");
const attachUser = require("../middleware/attachUser");
router.get("/csrfToken", getCsrfToken.getCsrfToken);
router.use(attachUser);
router.post("/signupQ", postSignupQ.postSignupQ);
module.exports = router
控制器/csrf.js
const getCsrfToken = (req, res) => {
res.json({ csrfToken: req.csrfToken() });
};
module.exports = { getCsrfToken };
context - 这里是 console.log(csrf):
useEffect(() => {
const getCsrfToken = async() => {
const { data } = await axios.get('api/csrfToken');
console.log("csurf", data);
axios.defaults.headers['X-CSRF-Token'] = data.csrfToken;
};
getCsrfToken();
}, []);
我不明白为什么我会收到错误消息,当我第一次发出 POST 请求以及刷新页面时一切正常。有什么问题,我该如何解决?
编辑
感谢 Jack Yu,上面的代码 sn-ps 正在运行。也许它可以帮助别人..
【问题讨论】:
-
在您的
server.js中,您是否也使用了app.use(csrf({cookie: true}))? -
是的。但我在 routes/index.js 中使用了它,而不是在 server.js 中。这是因为 routes/index.js 也是我调用令牌的地方。这会是个问题吗?感谢您查看我的代码!
标签: javascript node.js express csrf