首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cypress中受CSRF保护的登录问题

Cypress中受CSRF保护的登录问题
EN

Stack Overflow用户
提问于 2020-10-31 05:08:49
回答 3查看 1.3K关注 0票数 2

我尝试通过Cypress.io测试PHP Symfony应用程序,但使用使用CSRF保护的自定义登录命令时遇到了问题。

我的命令看起来像这样:

代码语言:javascript
运行
复制
Cypress.Commands.add('login', () => {
    cy.request('/login')
        .its('body')
        .then((body) => {
            const $html = Cypress.$(body);
            const csrf = $html.find('input[name=_csrf_token]').val();

            cy.request({
                method: 'POST',
                url: '/login',
                failOnStatusCode: false,
                form: true,
                body: {
                    username: 'user',
                    password: 'password',
                    _csrf_token: csrf,
                },
            })
        });
});

下面是测试规范:

代码语言:javascript
运行
复制
describe('Masterdata Test', () => {
    beforeEach(() => {
        cy.login();
        cy.visit('/masterdata/autoselector');
    });

    it('highlights the correct register', () => {
        cy.get('.registerTab.bg-white').contains('Masterdata');
    });
});

当我运行测试时,它似乎以某种方式登录工作(它返回200状态代码),但当它访问url时,它应该检查,它重定向到再次登录。(见下图)

我已经检查了CSRF令牌是否正确,我还从登录中删除了整个CSRF保护,并且只在我的登录命令中使用了第二个cy.request调用,它工作得很好。

有人能帮我解决这个问题吗?

EN

回答 3

Stack Overflow用户

发布于 2021-07-19 23:12:01

下面的代码对我有效,

PS:仅适用于基于UI的登录。

代码语言:javascript
运行
复制
before(() => {
    cy.visit("/");
    cy.get(/*<get the webelement for csrf token>*/).invoke('attr', 'value').then(($value) => {
        cy.setCookie('csrftoken', $value);
    });
});

beforeEach(() => {
    Cypress.Cookies.preserveOnce('csrftoken');
});
票数 1
EN

Stack Overflow用户

发布于 2020-10-31 05:54:06

票数 0
EN

Stack Overflow用户

发布于 2021-03-23 22:37:23

我遇到了完全相同的问题:表单重新加载时没有任何错误。

对我来说,这是因为Symfony中的php会话没有使用APP_ENV=test,因此csrf令牌在每次请求时都会改变;-)我不得不切换到devprod,然后它就工作得很好。

我是通过测试csfr令牌在两次重新加载之间是否相同来发现这一点的:

代码语言:javascript
运行
复制
describe('Check csrf', () => {
    it('Grabs Token and reloads', () => {
        // get csrf token and output to command log
        cy.request('/login')
        .its('body')
        .then((body) => {
        const $html = Cypress.$(body)
        const csrf = $html.find('input[name=_csrf_token]').val()
        cy.log(csrf)
        })

        // do the same again
        cy.request('/login')
        .its('body')
        .then((body) => {
        const $html = Cypress.$(body)
        const csrf = $html.find('input[name=_csrf_token]').val()
        cy.log(csrf)
        })
    })
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64615794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档