2013-04-25 60 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"