我真的很想擴展這個主題“使用 CSRF 令牌登錄”,因為我已經連續幾周撞墻了,而且我不可能是唯一一個遇到這個問題的人。所有關于通過 POST 登錄或使用 CSRF 登錄的主題都不可避免地回到了上面的鏈接。
然而,此鏈接中描述的食譜似乎對我不起作用。他們都假設一旦您訪問登錄頁面,就會創建 CSRF 令牌。但是在我們的網站上,CSRF 令牌僅在您登錄后創建。
我使用 Postman 進行了測驗,在您登錄之前,HTML 或標題中沒有 CSRF 令牌。
我還在 Cypress 中使用以下代碼對其進行了測驗:
describe('gimme dat csrf token', () => {
it('try to get the csrf token', () => {
cy.visit(Cypress.env('url'))
cy.getCookie('YII_CSRF_TOKEN')
.then(async (c) => {
cy.log(c.value)
return c.value
})
})
})
這將回傳錯誤,因為沒有 YII_CSRF_TOKEN
Type Error
Cannot read properties of null (reading 'value')
如果我之前添加登錄步驟,它將按預期回傳 CSRF 令牌的值:
import {Login} from "../../pages/login/Login";
describe('gimme dat csrf token', () => {
it('try to get csrf token', () => {
cy.visit(Cypress.env('url'))
login.loginCredentials(Cypress.env('userEmail'), Cypress.env('userPass')) //added login
cy.getCookie('YII_CSRF_TOKEN')
.then(async (c) => {
cy.log(c.value)
return c.value
})
})
})
因此,上述鏈接中的策略 #1(從 HTML 決議令牌)和 #2(從回應標頭決議令牌)不起作用。
方法 #3 也不可行,因為我們有幾個實時系統要測驗,而且我們無法公開 /csrf 路由
這只給我們留下了迄今為止我們一直在使用的策略 #4。
有什么想法還是我們堅持將“手動”登錄步驟添加到每個規范檔案中?
uj5u.com熱心網友回復:
我認為策略 #1 和 #2 依賴于瀏覽器記住憑據并將它們提供給登錄頁面,就像 Stackoverflow 頁面一樣 - 您不必每次訪問時都登錄。
主要區別在于您使用了cy.visit()而不是cy.request()如食譜中所示。
如果您仍然無法成功獲取令牌,請嘗試使用您的登錄名cy.session()。每個會話只會呼叫一次登錄函式。
/*
Enable use of cy.session() and new behavior to handle caching
and restoring cookies, localStorage, and sessionStorage.
*/
Cypress.config('experimentalSessionSupport', true)
describe('...', () => {
beforeEach(() => {
cy.session(() => {
login.loginCredentials(Cypress.env('userEmail'), Cypress.env('userPass'))
})
})
it('try to get csrf token', () => {
cy.getCookie('YII_CSRF_TOKEN')
.then((c) => {
cy.log(c.value)
})
})
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328960.html
標籤:javascript 验证 邮政 柏 csrf-token
