Привет всем, у меня проблема с защитой csrf.
Я использую экспресс для управления службой API и реагирую на клиентскую сторону.
Итак, я установил пакет csruf , а затем сделал следующее:
var csrfProtection = csrf({ cookie: {httpOnly: true} });
app.use(csrfProtection);
app.use(function(req, res, next) {
res.locals._csrf = req.csrfToken();
next();
});
app.use(function (err, req, res, next) {
if (err.code !== 'EBADCSRFTOKEN') return next(err)
res.status(403);
return res.json({"status": "failure"});
});
это в моем index.js (на стороне сервера).
Затем я регистрирую маршрут следующим образом:
app.use('/api/user/', users);
Пользователи определяются по:
const users = require('./routing/routes/User');
, и в этом файле User.js у меня есть запрос get / post / delete.У меня, например, такой запрос:
router.post('/biography', async(req, res, next) => {
try{
const {bio} = req.body;
const token = req.cookies.pusrd;
if(!bio || !token || typeof(bio) !== "string" || typeof(token) !== "string")
return res.json({"status": "failure", "message": "notValidParam.error"});
// change the token after success change username.
var isValid = jwt.verify(token, SECRET);
var userToCheck = isValid["username"];
var userExist = await User.findOne({username: userToCheck});
if(splitter.splitGraphemes(bio).length > 220)
return res.json({"status": "failure", "message": "biographyTooLong"});
if(!userExist)
return res.json({"status": "failure", "message": "notLoggedIn.error"});
userExist.biography = bio;
userExist.save();
return res.json({"status": "success", "message": "savedChanges.success"});
} catch(err){
console.log(req.cookies);
if(err.name == "JsonWebTokenError")
return res.json({"status": "failure", "message": "userNotLoggedIn.error"});
return res.json({"status": "failure", "message": "generalError"});
}
});
С этим кодом у меня ошибка 403 не разрешена (Запрещено: неверный токен csrf).
Мой клиентский код для выполнения запроса выглядит следующим образом:
var data = new URLSearchParams();
data.append("bio", this.state.bio);
data.append("_csrf", cookie.get('_csrf'));
fetch(server + '/api/user/biography', {
method: 'POST',
headers: {
'Content-type': 'application/x-www-form-urlencoded',
},
credentials: 'include',
body: data
}).then(
response => response.json(),
error => console.log(error)
).then((res) => {
if(res.status === "failure"){
this.showStack(this.lang.t(res.message), "error");
} else {
this.showStack(this.lang.t(res.message), "success");
}
});
Я также добавил _csrf в свой почтовый запрос, но это не решает проблему.
Где я не прав? Предложение console.log(req.cookies)
в catch тоже не работает ... поэтому я полагаю, что мой код не "поступает" в console.log ..