mocha 测试 post 路由,传递了_csrf, 但终端报错误 CSRF mismatch

发布于 2022-09-02 15:10:24 字数 1787 浏览 22 评论 0

我最近在练习写测试,在测试一条post路由的时候,需要传递CSRF,于是我参考了stackoverflow上的一个答案
How to test express form post with CSRF?

我参照这个答案,写了如下代码

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();
                    });
            });
    });
});

但是终端报错
Error: CSRF token mismatch
Error: expected 302 "Found", got 403 "Forbidden"

我不知道要如何处理这个问题,按照我的思路,我的测试模仿用户行为,先在/rear 这个路由的页面中拿到csrf,然后post到/user/signup这个路由,不知道是哪里出了错误。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧梦荧光笔 2022-09-09 15:10:24

我找到了问题原因, 虽然我抓到了从后端expose到前端input(name='_csrf')的csrf, 但我忽视了一点, 就是测试环境中也要持久化request and cookies, 后来我又去看了下supertest的文档, supertest 有一个.agent方法 可以 persist a request and its cookies

var agent = request.agent(app);

agent

.post('/user/signup')
.send({
    _csrf: csrf,
    name: 'admin',
    mobile: '12345678901',
    password: '123456',
    repassword: '123456',
    gender: '0'
})

这样测试就通过了
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文