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

우리는 그렇게 같은 path_prefix 사용하여 시도했다 :

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

    # Providers 
end 

을하지만, 그것은 단지 우리를 의미 대신 /my_site_1/auth/provider

답변

0

우리는 (같은 개념은 아마도 다른 업체에 적용되는 것이지만, 구글의 오픈 ID 공급자에 대한 구성 포함) 다음 omniauth 초기화와 함께이 작업을 수행 할 수 있었다 사용할 수있는의 /:site_name/auth/provider을 방문해야 :

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" 
관련 문제