2017-07-10 84 views
0

所以我在這裏我使用設計的電子郵件登錄一個完全工作4.2 Rails應用程序,並且完全用於設計無關的Oauth流omniauth。Rails的4.2升級到5個結果中的ActionController :: InvalidAuthenticityToken

我決定更新到5.1.2的Rails,並得到了可怕的CSRF InvalidAuthenticityToken。嘗試通過設計(電子郵件)登錄或使用omniauth時發生這種情況。

​​

Sessions Controller沒有任何相關性,沒有before_ filters,沒有特定的方法。

Started POST "https://stackoverflow.com/users/sign_in" for 127.0.0.1 at 2017-07-09 22:32:25 -0100 
Processing by Users::SessionsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"eTJnjnTDNbahT+W8ajr9fH8tGSC0wfismuNbwr0qtQkYoCoFqDm5kZ+nlwAnz+RbLL4v41oqgmqJzaIVJYWxXw==", "user"=>{"email"=>"*****@gmail.com", "password"=>"[FILTERED]"}, "commit"=>"log in"} 
Can't verify CSRF token authenticity. 
Completed 422 Unprocessable Entity in 2ms (ActiveRecord: 0.0ms) 



ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 

actionpack (5.1.2) lib/action_controller/metal/request_forgery_protection.rb:195:in `handle_unverified_request' 

的HTML被渲染與CSRF標題:

<meta name="csrf-param" content="authenticity_token"> 
<meta name="csrf-token" content="eTJnjnTDNbahT+W8ajr9fH8tGSC0wfismuNbwr0qtQkYoCoFqDm5kZ+nlwAnz+RbLL4v41oqgmqJzaIVJYWxXw=="> 

而且形式以及上:

<input type="hidden" name="authenticity_token" value="eTJnjnTDNbahT+W8ajr9fH8tGSC0wfismuNbwr0qtQkYoCoFqDm5kZ+nlwAnz+RbLL4v41oqgmqJzaIVJYWxXw=="> 

當通過omniauth嘗試:

Started GET "/auth/linkedin" for 127.0.0.1 at 2017-07-09 23:10:47 -0100 
I, [2017-07-09T23:10:47.726334 #33989] INFO -- omniauth: (linkedin) Request phase initiated. 
Started GET "/auth/linkedin/callback?code=AQTYEqh7Ly5soZIFs_XfERBDL-EzRb-q_tkJgIIpLZWhlpcNLG6Ib9dQg2_74gRjDquZp_B3zTXjaBgpoRnJgbVoyVyMad0Ft8kjyMkTdhxPgWO5jbA&state=7f63139d28f961f32c789d07cc7ddfb6cd7c09b26af91733" for 127.0.0.1 at 2017-07-09 23:10:48 -0100 
I, [2017-07-09T23:10:48.980311 #33989] INFO -- omniauth: (linkedin) Callback phase initiated. 
E, [2017-07-09T23:10:48.980683 #33989] ERROR -- omniauth: (linkedin) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected 
E, [2017-07-09T23:10:48.981033 #33989] ERROR -- omniauth: (linkedin) Authentication failure! invalid_credentials: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected 

OmniAuth::Strategies::OAuth2::CallbackError (csrf_detected | CSRF detected): 

我已經嘗試過:

protect_from_forgery with: :exception, prepend: false(&真)

硬編碼在config/secrets.yml:具有Env的可變

我先前使用這個上沿着

secret_key_base: <%= ENV['SECRET_KEY_BASE'] %> 

development: 
    secret_key_base: 0beec021fbe866716933a1da494be36f21bb6cf446ab7d315eb129706931bb2b284aa8e5507d0ab829abb8c2155958b47500aeadd5eace9cdc27643121cf6adf 

&試圖與:

# Load the Rails application. 
require_relative 'application' 
# Load the app's custom environment variables here, before environments/*.rb 
app_env_vars = File.join(Rails.root, 'config', 'initializers', 'app_env_vars.rb') 
secret = File.join(Rails.root, 'config', 'initializers', 'secret_token.rb') 
load(app_env_vars) if File.exists?(app_env_vars) 
load(secret) if File.exists?(secret) 

# Initialize the Rails application. 
Rails.application.initialize! 

嘗試沒有它,並通過在該文件中定義的所有環境變量的.bash_profile終端負載。

所以基本上我跑出去的想法,如果您有任何,請分享,感謝

+0

從5.0.4升級到5.1.2後,我面臨完全相同的問題。你能找到根本原因嗎? – Juampi

+0

@Juampi我沒有 - 我沒有看,因爲我通過將項目內容複製到新的rails 5.1.2項目文件夾中解決了這個問題。既然它從一開始就起作用,我會想象這是'rails'更新程序忘記更改的一些東西? –

+0

@Juampi也許它甚至是設計安裝?也許這是值得複製你的項目文件夾,卸載設計,刪除寶石,捆綁安裝,把寶石回來,安裝,複製你的自定義設計控制器和視圖回來,看看它是否工作?如果這個作品在你的「真實」項目上做了同樣的事情 –

回答

0

你試過之前把你的行動之前你protect_from_forgery和前置設置爲false?所以,你的應用控制器會是這個樣子:

before_action :configure_permitted_parameters, if: :devise_controller? 
protect_from_forgery with: :exception, prepend: false 

protected 

def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, 
    :last_name]) 
    devise_parameter_sanitizer.permit(:account_update, keys: 
    [:first_name, 
    :last_name]) 
end 

def after_sign_in_path_for(resource) 
    user_path(id: resource.id) 
end 

或者你可以嘗試做的是,因爲你使用OAuth在before_action認證用戶如下面的代碼,從這個博客上切換拍攝從導軌4到導軌5,隨時閱讀。 (http://blog.bigbinary.com/2016/04/06/rails-5-default-protect-from-forgery-prepend-false.html

class ApplicationController < ActionController::Base 
before_action :authenticate 
protect_from_forgery unless: -> { @authenticated_by.oauth? } 

private 
def authenticate 
    if oauth_request? 
    # authenticate with oauth 
    @authenticated_by = 'oauth'.inquiry 
    else 
    # authenticate with cookies 
    @authenticated_by = 'cookie'.inquiry 
    end 
end 
end 

希望這些回答的一個幫助你。

+0

感謝您花時間和您的建議。我試過這個命令,它沒有改變任何東西。 @authenticated異常的問題是,在那時我沒有用戶身份驗證 - CSRM失效發生在omniauth的oauth流的回調中。 –

+0

對不起,沒有答案。我很高興你通過將你的rails 4應用程序複製到一個全新的rails 5應用程序來運行。我一定會說寫測試對未來來說是值得的投資。 LOLZ。我仍然想知道這個問題是什麼,並會進一步挖掘並向我認識的幾位資深Rails開發人員求教,如果想出任何東西,我會告訴你。 – kparekh01

+0

沒問題,謝謝你看着它。可能在軌道之間:更新和捆綁更新有些東西壞了。順便說一下,我現在使用Rails 5.0.4運行它,它從一開始就運行良好,只是找出我應該移動/ lib文件夾的方式,但是這是記錄並歸結爲選擇。 (在我嘗試直接更新到5.1.2之前 - 我會在接下來的幾天嘗試更新到5.1.2,如果這不起作用,我會在某處發佈作爲問題?) –

0

我無法找出問題所在。實際上,我只是創建了一個全新的rails 5應用程序,將所有內容都複製過來,並且從一開始就起作用。

0

首先,我建議逐步更新的應用程序,即以最新的補丁版本,這是4.2。9暫時。確保它仍然正常工作,測試套件是綠色的:)然後你就可以將應用程序更新到5.0.4。每次升級主要或次要版本時,請記得運行從Rails 5.0+開始的rake rails:updaterails app:update)來更新配置和一些其他最初生成的文件。這是一個鏈接到Rails guide on upgrading from Rails 4.2 to Rails 5.0

+0

謝謝@dskecse我認爲我直接進入Rails 5.1做了一個大的跳躍,然後我沒有測試套件,現在我肯定會開始寫一個大聲笑。但開始一個新的rails應用程序,基本上覆制一切選擇性,工作正常。無論如何,我會投資寫一些測試:x –

相關問題