我正在尝试为我的服务器端表单验证编写测试,但我一直收到Forbidden错误。看起来这需要一个两步的过程。步骤1,从表单中获取CSRF值。步骤2,使用CSRF值发布到表单处理程序。但无论我如何尝试发布,我都会收到一个禁止的错误。
- 完整测试:https://github.com/socketwiz/swblog/blob/master/test/contact.js#L57-L100
我试过这样改变以下行: https://github.com/socketwiz/swblog/blob/master/test/contact.js#L85
.send({name: 'foo', 'X-CSRF-Token': token})
.set('X-CSRF-Token', token)
.set('Cookie', ['X-CSRF-Token=' + token])
但我尝试的任何东西似乎都不符合CSRF的要求。我越是尝试越复杂,这似乎是一件简单的事情。也许我说这一切都错了。有什么想法吗?
答案 0 :(得分:14)
谢谢@shawnzhu,你对cookies的评论帮助我找出了我需要做的事情。我有一个想法,我让它复杂化了。以下是我提出的建议:
https://github.com/socketwiz/swblog/blob/master/test/contact.js
it('should not post just a name', function(done) {
request(mock)
.get('/contact')
.end(function(err, res){
var $html = jQuery(res.text);
var csrf = $html.find('input[name=_csrf]').val();
request(mock)
.post('/api/contact.json')
.set('cookie', res.headers['set-cookie'])
.send({
_csrf: csrf,
name: 'Mary Jane'
})
.expect(function(res){
assert.equal(undefined, res.body.name);
assert.equal('You must provide a valid email address', res.body.email);
assert.equal('You must provide a message', res.body.message);
})
.expect(500, done);
});
});
答案 1 :(得分:2)
express csrf中间件在会话中保存一个秘密以验证csrf令牌,而我猜你使用cookieSession中间件作为会话存储。因此,您需要在使用csrf令牌POST数据时重新发送会话cookie,快递可以使用会话中的秘密来验证您的csrf令牌。