2016-03-10 102 views
6

我在Rails 4應用程序中使用Devise 3.5和Omniauth。我創建了一個與Facebook的集成,允許用戶將他們的Facebook帳戶連接到我的應用程序。目前,當用戶點擊連接按鈕時,它們被髮送到/user/auth/facebook,然後重定向到Omniauth生成的回調URL:/user/auth/facebook/callback。我想在某些情況下手動覆蓋此回調網址 - 這意味着我不想在初始化程序中覆蓋它 - 具有完全合格的網址。例如,如果用戶從http://www.example.com/開始,我可能想用http://app.example.com/user/auth/facebook/callback覆蓋默認的回調網址。Devise/OmniAuth覆蓋默認回調網址

我的應用程序具有動態子域,用戶將(幾乎)始終開始子域上的身份驗證過程。不幸的是,Facebook似乎並不支持oauth重定向網址中的通配符,這就是爲什麼我希望能夠檢測用戶是否在子域上,並將回調網址調整爲我已在我的Facebook應用上列入白名單的內容,以便授權過程成功。

從我讀到的,url helper omniauth_authorize_path接受附加參數作爲參數傳遞。我試圖通過一個定製的回調路徑像這​​樣,但沒有成功:

user_omniauth_authorize_path(:facebook, callback_path: @custom_callback) 

我也試着改變callback_pathredirect_urlredirect_uri,但似乎沒有任何工作。當我查看生成的鏈接時,確實將回調作爲參數包含在url中,但是當我單擊該鏈接時,我將重定向回默認回調url而不是自定義回調url。

+0

我需要這個功能太:( – diogopms

回答

0

以下是我解決了這個問題。我肯定還有其他的方法,但是這似乎是最簡單最優雅的解決方案,我能想出。

config/routes.rb我建立了一個auth子域。我所有的Oauth連接請求將開始在不同的子域名,然後Facebook正在建立將這些用戶轉發回t他auth.example.com子域。

constraints AuthRedirect do 
    devise_scope :contact do 
     get '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
     post '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
    end 
end 

這是/lib/auth_redirect.rb。這只是檢查子域是否爲auth並捕獲該流量。這是放置在我的路由列表的頂部,以便優先於其他子域。

class AuthRedirect 
    def self.matches?(request) 
     request.subdomain.present? && request.subdomain == 'auth' 
    end 
end 

然後在我的客戶端,當用戶點擊該按鈕Connect with Facebook,我送他們到/auth/facebook?contact_id=<id>。從這裏Devise將他們引導到Facebook,然後將他們重定向回https://auth.example.com/

然後在OmniauthCallbacksController#facebook我可以從omniauth PARAMS拉動用戶的ID如下:

auth = env["omniauth.auth"] 
contact = Contact.find(env['omniauth.params']['contact_id']) 

在這裏,我能堅持憑證到數據庫,並重定向用戶返回到適當的子域。該解決方案避免了問題CSRF令牌,並且更重要的是不需要我使用Ruby/ERB打造omniauth授權路徑用戶發送到當他們點擊連接按鈕。

1

你試過redirect_uri嗎?

user_omniauth_authorize_path(:facebook, redirect_uri: @custom_callback) 

編輯:對不起,我錯過了您的文章的第二部分。

我實際上在生產中遇到了同樣的問題,但它在分段環境中完美地工作。唯一的區別是關於分期回調URL其中有一個更加子域* .staging.domain.com

通過可以提供在色器件初始化文件的靜態callback_url方式:

config.oaumniauth :facebook, ..., callback_url: 'url right here' 

我這個昨天在這個問題上。 要麼我提供了一個靜態的回調URL但Facebook提出了我的CRSF錯誤:

omniauth: (facebook) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected 

或者我讓設計動態設置callback_url這會看起來像

https://*.domain.com/DEVISE_MODELS/auth/facebook 

在這種情況下,我得到一個直在FG登錄過程中不匹配/列入白名單的回調URL。

編輯2:

好!我做到了。我可以通過通配符子域名登錄oauth。

  1. 在色器件初始化
  2. 提供靜態callback_url域添加到您的會話存儲爲: 域」。域。COM」

隨着那我越來越沒有CRSF錯誤,也不nunmatching CB網址/白名單。

希望它會爲你工作!

+0

我其實解決了這個一段時間回來,忘了後我的解決方案。這真的很簡單,我會用我所用的溶液更新我的答案。不幸的是我沒有時間或目前的資源來測試你的解決方案,但它看起來可行,所以我會給它一個upvote。 – ACIDSTEALTH