必须遗漏一些明显的东西,但由于其 CSRF 保护,我非常坚持登录 Django。
我查看了使用 cy.getCookie() 来测试使用 HTML Web 表单登录的示例食谱,但如果它推荐的第一件事是禁用 CSRF,那真的没有多大帮助。
Django想要什么:
这是一个正常的、受 CSRF 保护的 Django 登录视图在其传入的 POST 数据中所期望的:
csrfmiddlewaretoken=Y5WscShtwZn3e1eCyahdqPURbfHczLyXfyPRsEOWacdUcGNYUn2EK6pWyicTLSXT
username=guest
password=password
next
它没有在请求标头中查找 CSRF,也没有x-csrf-token
在响应标头上进行设置。
而且,使用我的代码,我永远不会传入让 Django 返回 403 错误的 csrf 令牌。
Cypress.Commands.add("login", (username, password) => {
var login_url = Cypress.env("login_url");
cy.visit(login_url)
var hidden_token = cy.get("input[name='csrfmiddlewaretoken']").value;
console.log(`hidden_token:${hidden_token}:`)
console.log(`visited:${login_url}`)
var cookie = cy.getCookie('csrftoken');
// debugger;
var csrftoken = cy.getCookie('csrftoken').value;
console.log(`csrftoken:${csrftoken}:`)
console.log(`request.POST`)
cy.request({
method: 'POST',
form: true,
url: login_url,
// body: {'username': 'guest', 'password': 'password', 'csrfmiddlewaretoken': cy.getCookie('csrftoken').value}
body: {'username': 'guest', 'password': 'password', 'csrfmiddlewaretoken': hidden_token}
})
})
赛普拉斯的错误:
我怀疑 POST 数据与undefined
通过隐藏表单输入或 cookie 获取方法的令牌有关,如console.log
for 所示。
现在,我已经开始查看https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/logging-in__csrf-tokens我想我应该能够调整策略 #1 :从 HTML 解析令牌以获取,$("input[name='csrfmiddlewaretoken']").value
但我希望有人以前做过。
我的另一个想法是有条件地向 Django 添加一个请求中间件,该中间件将从请求标头中获取 csrftoken 并在丢失时注入 POST 表单数据。如果我将它插入到 CSRF 之前触发,那会起作用吗?
最后,我打算将sessionid
令牌排除在重置之外,这样我就可以在登录一次后运行多个测试。
env:Django 1.10,cypress 1.4.2,现在升级到 2.0.0,同样的问题。