Для моего проекта 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.
Спасибо!