2013-04-25 61 views
0

是否有可能範圍omniauth路徑資源?例如,假設我們有一個任意網站建設的網站,在那裏我可以範圍通過類似的網站在路線:範圍Omniauth路線

get ":site_name", :to => "sites#show" 

我現在想通過omniauth添加驗證,但有它在各個場地工作,所以,如果我可以手動指定omniauth路線,它可能是:

get ":site_name/auth/:provider", :to => "omniauth#whatever" 
get ":site_name/auth/failure", :to => "omniauth#failure" 
get ":site_name/auth/:provider/callback", :to => "my_omniauth_callbacks#auth" 

我們已經使用像這樣的嘗試串流中:

Rails.application.config.middleware.use OmniAuth::Builder do 
    configure do |config| 
    config.path_prefix = "/:site_name/auth" 
    end 

    # Providers 
end 

,但它只是意味着我們要訪問/:site_name/auth/provider而不是能夠使用/my_site_1/auth/provider

回答

0

我們可以用下面的omniauth初始化做到這一點(包括谷歌的OpenID提供商的配置,但相同的概念很可能適用於其他供應商):

require "openid/store/filesystem" 

Rails.application.config.middleware.use OmniAuth::Builder do 
    AUTH_REGEX = /^\/([^\/]+)\/auth\/([^\/]+)$/ 
    CALLBACK_REGEX = /^\/([^\/]+)\/auth\/([^\/]+)\/callback$/ 
    SITE_REGEX = /^\/([^\/]+)(?:\/auth\/([^\/]+)\/callback)?/ 

    configure do |config| 
    config.on_failure = lambda do |env| 
     match_data = SITE_REGEX.match env["PATH_INFO"] 

     if match_data 
     provider = match_data[2] || "unknown" 
     location = "/#{match_data[1]}/auth/#{provider}/failure" 
     else 
     location = "/unknown/auth/unknown/failure" 
     end 

     Rack::Response.new(["302 Moved"], 302, "Location" => location).finish 
    end 
    end 

    callback_path = lambda do |env| 
    env["PATH_INFO"] =~ CALLBACK_REGEX 
    end 

    request_path = lambda do |env| 
    match_data = AUTH_REGEX.match env["PATH_INFO"] 

    if match_data 
     "/#{match_data[1]}/auth/#{match_data[2]}/callback" 
    end 
    end 

    provider :openid, :name => "google", 
        :identifier => "https://www.google.com/accounts/o8/id", 
        :store => OpenID::Store::Filesystem.new("/tmp"), 
        :callback_path => callback_path, 
        :request_path => request_path 
end 

這將利用回調中的站點名稱,原始身份驗證鏈接以及失敗鏈接。然後可以在routes.rb中與以下路線配對:

get "/:site_name/auth/:provider/failure", :to => "my_omniauth#failure" 
post "/:site_name/auth/:provider/callback", :to => "my_omniauth#callback"