摩卡测试错误CSRF令牌不匹配

时间:2016-05-09 05:43:06

标签: mocha csrf bdd supertest

我最近学习如何使用mocha和supertest编写测试。 当我尝试测试帖子网址时,它需要_csrf属性,所以我检查一下 [如何用CSRF测试快递表格?

] 1

并输入以下代码

var request = require('supertest');
var should = require('should');
var app = require('../app');
var $ = require('jquery')(require("jsdom").jsdom().parentWindow);


describe('User', function () {

    it('should create a admin', function (done) {
        request(app)
            .get('/rear')
            .expect(200)
            .end(function (err, res) {
                if (err) return done(err);
                should.not.exist(err);
                var $html = $(res.text);
                var csrf = $html.find('input[name=_csrf]').val();
                console.log(csrf);
                should.exist(csrf);
                request(app)
                    .post('/user/signup')
                    .send({
                        _csrf: csrf,
                        name: 'admin',
                        mobile: '12345678901',
                        password: '123456',
                        repassword: '123456',
                        gender: '0'
                    })
                    .expect(302)
                    .end(function (err, res) {
                        if (err) return done(err);
                        should.not.exist(err);
                        res.header.location.should.include('/rear');
                        done();
                    });
            });
    });
});

终端通知说 错误:CSRF令牌不匹配 错误:预期302“发现”,得到403“禁止”

我的代码模仿用户行为,在/后路由器渲染的页面上获取csrf然后将其发布到/ user / signup,我不知道哪里出错了以及如何修复它。如果您发现原因,请提醒我,非常感谢。

1 个答案:

答案 0 :(得分:0)

我找出了麻烦的地方。我得到csrf哪个中间件lusca在输入中将表单服务器暴露到首页(name =' _csrf')但我忽略了在测试环境中它还应该保留请求及其cookie,我再次检查supertest doc它可以调用.agent方法来实现它。

var agent = request.agent(app);

describe('User', function () {

    it('should create a admin', function (done) {
        agent
            .get('/rear')
            .expect(200)
            .end(function (err, res) {
                if (err) return done(err);
                should.not.exist(err);
                var $html = $(res.text);
                var csrf = $html.find('input[name=_csrf]').val();
                console.log(csrf);
                should.exist(csrf);
                request(app)
                    .post('/user/signup')
                    .send({
                        _csrf: csrf,
                        name: 'admin',
                        mobile: '12345678901',
                        password: '123456',
                        repassword: '123456',
                        gender: '0'
                    })
                    .expect(302)
                    .end(function (err, res) {
                        if (err) return done(err);
                        should.not.exist(err);
                        res.header.location.should.include('/rear');
                        done();
                    });
            });
    });
});