2013-11-09 33 views
3

只是升級到2.2.1,我對CSRF處理髮生了什麼感到困惑。使用默認配置,我總是會得到「丟失CSRF令牌」錯誤,即使會話數據中有清楚的csrfToken。Play中的CSRF 2.2.1當啓用csrf.sign.tokens時,Scala總是失敗

隨着更多的戳我發現我可以通過在設置中將csrf.sign.tokens設置爲false來防止這種情況(默認爲true)。由於某些原因行:

token.flatMap(Crypto.extractSignedToken) 
    .map(token => Token(Crypto.signToken(token))) 

CSRF.getToken是給我一個無令牌。有沒有人知道當啓用令牌簽名時,CSRF僅會失敗。我沒有(明知)更改任何CSRF相關的配置默認值。我的懷疑是,不知何故令牌的格式不正確,Crypto.extractSignedToken失敗,但我不明白爲什麼會出現這種情況。

我的應用程序的CSRF保護使用全局WithFilters(CSRFFilter())方法完成。

+0

我有同樣的問題。我無法手動重現錯誤但收到一些錯誤每日更新報告任何更新麥克?感謝發佈。 –

+0

對不起,蘭迪,我還沒有時間重新訪問這個,我仍然使用未簽名的令牌,但如果我想出來,我會在這裏提供一個答案 – Mikesname

+0

謝謝邁克。我切換到未簽名的令牌,仍然得到錯誤。對我來說,它只發生在公衆面臨的形式。 –

回答

1

這似乎是因爲Play 2.1.x中的CSRF令牌與2.2或2.3中的CSRF令牌不兼容。如果您有來自2.1.x應用程序的cookie,然後將應用程序升級到2.2,則當客戶端使用舊的cookie值發出請求時可以看到此問題。我發現最簡單的解決辦法是在application.conf重命名令牌如下:

csrf.token.name=csrfToken1 

一個討厭的劈位,但它的作品。我考慮將令牌移動到它自己的cookie(使用csrf.cookie.name屬性,但仍導致「丟失的CSRF令牌」錯誤

+0

當你看到令牌值時,這是顯而易見的 - 在2.1.x中它們是20個字符,而在2.3中它們是〜76 – mtpettyp