具有react js的csruf:无效的csrf令牌

时间:2019-01-29 12:33:56

标签: node.js reactjs express

大家好,我的csrf保护有问题。

我正在使用express管理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 ,但不能解决问题。

我在哪里错了? catch子句中的console.log(req.cookies)也不起作用..所以我想我的代码不会“到达” console.log。

0 个答案:

没有答案