csruf с реагировать js: неверный токен csrf - PullRequest
0 голосов
/ 29 января 2019

Привет всем, у меня проблема с защитой 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 ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...