devise_saml_authenticatable множественная установка IDP - PullRequest
0 голосов
/ 04 марта 2019

Для моего проекта Ruby on Rails я хочу использовать несколько IDP для единого входа.Я использую devise и devise_saml_authenticatable драгоценные камни.

Скажем, у меня сейчас есть 2 ВПЛ:

http://localhost:4434/users/saml/sign_in

http://www.another_idp_entity_id.biz

Как в https://github.com/apokalipto/devise_saml_authenticatable, my config/initializers/devise.rb похоже

Devise.setup do |config|
  ...Other configs
  class IdPSettingsAdapter
    def self.settings(idp_entity_id)
    callback = Rails.env.development? ? 'http://localhost:4434' : ENV['CALLBACK_ADDRESS']
    case idp_entity_id
    when "http://localhost:4434/users/saml/sign_in"
      {
          assertion_consumer_service_url: "#{callback}/users/saml/auth",
          assertion_consumer_service_binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
          name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
          issuer: "#{callback}/users/saml/metadata",
          idp_entity_id: "http://localhost:4434/users/saml/sign_in",
          authn_context: "",
          idp_slo_target_url: "https://xxx.okta.com/app/xxx_1/exkb54ho042xBVrQm356/sso/saml",
          idp_sso_target_url: "",
          idp_cert_fingerprint: 'A3:FE:AA:9F:F2:29:C5....',
          idp_cert_fingerprint_algorithm: 'http://www.w3.org/2000/09/xmldsig#sha256'
    }
    when "http://www.another_idp_entity_id.biz"
      {
          assertion_consumer_service_url: "http://localhost:3000/users/saml/auth",
          assertion_consumer_service_binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
          name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
          issuer: "http://localhost:3000/saml/metadata",
          idp_entity_id: "http://www.another_idp_entity_id.biz",
          authn_context: "",
          idp_slo_target_url: "http://another_idp_slo_target_url.com",
          idp_sso_target_url: "http://another_idp_sso_target_url.com",
          idp_cert: "another_idp_cert"
      }
    else
      {}
    end
  end
  end

  # ==> SAML
  config.saml_create_user = true
  config.saml_update_user = true
  config.saml_default_user_key = :email
  config.saml_session_index_key = :session_index
  config.saml_use_subject = true
  config.idp_entity_id_reader = 
  DeviseSamlAuthenticatable::DefaultIdpEntityIdReader
  config.idp_settings_adapter = IdPSettingsAdapter
end

Это даст мне ошибку raise "Invalid settings, idp_sso_target_url is not set!" if settings.idp_sso_target_url.nil?.

Я пытался использовать только 1 IDP без моего IdPSettingsAdapter, но со следующим дополнительным кодом ниже # ==> SAML:

config.saml_create_user = true
config.saml_update_user = true
config.saml_default_user_key = :email
config.saml_session_index_key = :session_index
config.saml_use_subject = true
config.idp_entity_id_reader = DeviseSamlAuthenticatable::DefaultIdpEntityIdReader
config.idp_settings_adapter = nil
callback = Rails.env.development? ? 'http://localhost:4434' : ENV['CALLBACK_ADDRESS']

config.saml_configure do |settings|
  settings.assertion_consumer_service_url     = "#{callback}/users/saml/auth"
  settings.assertion_consumer_service_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
  settings.name_identifier_format             = "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
  settings.issuer                             = "#{callback}/users/saml/metadata"
  settings.authn_context                      = ""
  settings.idp_slo_target_url                 = ""
  settings.idp_sso_target_url                 = "https://xxx.okta.com/app/xxx1/exkb54ho042xBVrQm356/sso/saml"
  settings.idp_cert_fingerprint               = 'A3:FE:AA:9F:F2:29:C5...'
  settings.idp_cert_fingerprint_algorithm     = 'http://www.w3.org/2000/09/xmldsig#sha256'
end

И это сработало бы и перенаправило бы меня в Okta, чтобы подписатьв. Однако это только 1 IDP, и мне нужно, чтобы он работал с несколькими IDP.

Спасибо!

...