2014-03-06 42 views
0

Rails(3.2.1)中有一個路由問題。Rails中的Omniauth-saml:/ auth/saml/metadata中找不到路由的錯誤

我使用omniauth-saml進行身份驗證(https://github.com/PracticallyGreen/omniauth-saml)。該醫生說:

「用來緩解在iDP的SAML SP的配置服務提供商的元數據可以從http://example.com/auth/saml/metadata檢索發送該URL到IdP進行的管理者。」

當我到myserver.com/auth/saml/metadata時,出現路由錯誤(無路由匹配)。我在routes.rb中唯一相關的路由是/ auth /:provider/callback。我需要添加哪條路線才能訪問元數據URL?

驗證本身按預期工作。我只有元數據有問題。

非常感謝!

+0

我想知道這個問題的答案爲好。 – Aaron

回答

0

您可以生成通過添加下面的匹配到的routes.rb *元數據路徑:

devise_scope :user do 
    match "https://stackoverflow.com/users/auth/:action/metadata", 
    constraints: { action: /saml/ }, 
    to: "omniauth_callbacks", 
    as: :user_omniauth_metadata, 
    via: [:get, :post] 
end 

以如下的路線得到的(沒有 「(.format)」):

user_omniauth_metadata GET|POST /users/auth/:action/metadata omniauth_callbacks#(?-mix:saml) 

這是在除了標準omniauth路線:

user_omniauth_authorize GET|POST /users/auth/:provider  omniauth_callbacks#passthru {:provider=>/saml/} 
user_omniauth_callback GET|POST /users/auth/:action/callback omniauth_callbacks#(?-mix:saml) 

從結果:

devise_for :users, controllers: { omniauth_callbacks: "omniauth_callbacks" } 

注:我用的色器件這樣做:用戶範圍,但範圍之外它看起來更像是:

match("/auth/:action/metadata", 
    constraints: { action: /saml/ }, 
    to: "omniauth_callbacks", 
    as: :omniauth_metadata, 
    via: [:get, :post] 
) 

您還需要定義一個回調「other_phase」; 例如添加類似以下到您的SAML策略

module OmniAuth 
    module Strategies 
    class Saml 

     include OmniAuth::Strategy 

     def other_phase 
     if on_path?("#{request_path}/metadata") 
      # omniauth does not set the strategy on the "other_phase" 
      @env['omniauth.strategy'] ||= self 
      setup_phase 

      response = OneLogin::RubySaml::Metadata.new 
      settings = OneLogin::RubySaml::Settings.new # set whatever params you want on this guy 
      Rack::Response.new(response.generate(settings), 200, 
          { "Content-Type" => "application/xml" }).finish 
     else 
      call_app! 
     end 
     end 
    end 
    end 
end