由于csrf无效,登录请求失败

时间:2018-02-23 02:20:41

标签: cypress

我正在测试keystonejs(http://demo.keystonejs.com/)的登录页面,无法获得使用cypress成功的请求。没有cypress的登录请求具有以下请求标头:

enter image description here

而带有cypress测试的请求具有以下请求标头:

enter image description here

我能看到的唯一区别是没有在cypress测试请求中设置cookie。因此,请求获得403.我实际上使用的是该服务器的本地版本,其中我将电子邮件/密码配置为图像中的一个。演示站点使用该页面中提供的不同集合。

测试很简单:

describe('The Keystone Admin UI Signin Page', function () {
  before(function() {
        cy.visit('http://localhost:3000/keystone/signin')
    })

    it('should signin successfully with valid email/password', function () {
        cy.get('#signin-view input[name=email]').clear().type('user@test.e2e');
        cy.get('#signin-view input[name=password]').clear().type('test');
        cy.get('#signin-view button[type=submit]').click();
        cy.get('#react-root').should('be.visible');
    })
})

无论如何要绕过这个?

2 个答案:

答案 0 :(得分:1)

我知道这是一个比较老的问题,但是我会贴出来,以防它对任何人有帮助。

为我解决此问题的关键是赛普拉斯在每次测试(https://docs.cypress.io/api/commands/clearcookies.html#)之前都会清除所有cookie。

所以在上面的示例中(根据我的经验):

  • 第一个测试(加载页面)已运行并通过正常-此时,浏览器已设置csrftoken cookie
  • 第二项测试(提交表单)正在运行,但在此之前,赛普拉斯已删除csrftoken cookie,因此出现错误

要解决此问题,我必须在Cypress配置中将csrftoken cookie列入白名单,这意味着它将免于此清除过程:

Cypress.Cookies.defaults({
    whitelist: "csrftoken"
})

您可以在测试文件中内联执行此操作,但文档建议使用support文件:

  

放置此配置的好地方是cypress / support / index.js文件,因为它是在评估任何测试文件之前加载的。

希望这会有所帮助,斯蒂芬。

答案 1 :(得分:0)

根据FlatSteve的答案,与Laravel一起使用,并使用更新的道具名称;

Cypress.Cookies.defaults({
    preserve: ["XSRF-TOKEN", "your_laravel_session_name", "remember_token"]
});
相关问题