Внедрение единого входа в Rails с федерацией Ping

#ruby-on-rails #devise #single-sign-on #saml #onelogin

#ruby-on-rails #разработка #единый вход #saml #onelogin

Вопрос:

В моем проекте Ruby on Rails мне нужно реализовать единый вход SAML с идентификатором Ping в качестве моего IDP. Драгоценный камень, который я использую, это devise_saml_authenticatable

В моем config/initializers/devise.rb у меня есть:

 
config.saml_route_helper_prefix = 'saml'
  # ==> 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

  config.saml_configure do |settings|
    settings.assertion_consumer_service_url     = "#{Settings.devise_callback}/users/saml/auth"
    settings.assertion_consumer_service_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
    settings.name_identifier_format             = Settings.clientname.sso.name_identifier_format
    settings.issuer                             = "#{Settings.devise_callback}/users/saml/meta_data"
    settings.idp_entity_id                      = Settings.clientname.sso.idp_entity_id
    settings.authn_context                      = ""
    settings.idp_slo_target_url                 = Settings.clientname.sso.idp_slo_target_url
    settings.idp_sso_target_url                 = Settings.clientname.sso.idp_sso_target_url
    settings.idp_cert_fingerprint               = Settings.clientname.sso.idp_cert_fingerprint
    settings.idp_cert_fingerprint_algorithm     = 'http://www.w3.org/2000/09/xmldsig#sha256'
  end
  

В моем app/models/user.rb у меня есть

 devise :database_authenticatable, :rememberable, :trackable, :validatable, :recoverable, :timeoutable, :session_limitable, :saml_authenticatable
  

Помимо использования IDP моего клиента, я настроил IDPS с помощью Onelogin и Okta, и приведенный выше код работает отлично.

В отличие от Onelogin и Okta, IDP моего клиента, предлагаемый Ping Identity, сначала не показывает вам страницу для ввода вашего электронного адреса, а затем другую страницу для ввода вашего пароля. Другими словами, нет страницы входа IDP, такой как Onelogin и Okta.

Итак, вопрос в том, что прямо сейчас у меня есть идентификатор объекта IDP клиента, целевой URL единого входа, целевой URL SLO, отпечаток пальца. Как мне пройти аутентификацию в IDP через форму и войти в систему пользователя?

До сих пор я пытался

 =form_tag(Settings.sso.idp_sso_target_url, html: {role: 'form'}, method: :post) do |f|
    .form-group
      label for="email"  Email
      = email_field_tag :email
    .form-group
      label for="password"  Password
      = password_field_tag :password
      button.btn.btn-info.btn-sm type="submit"  Submit
      | amp;nbsp;

  

где Settings.sso.idp_sso_target_url — это целевой URL единого входа, который выглядит как https://auth2test.clientname.ca/idp/SSO.saml2

Используя Ping в качестве IDP, я получил это:

 <S11:Envelope><S11:Body><S11:Fault><faultcode>soapenv:Client</faultcode><faultstring>Invalid Request</faultstring></S11:Fault></S11:Body></S11:Envelope>
  

Затем я протестировал использование Onelogin в качестве IDP, он просто перенаправил меня на страницу, где я ввожу свой email.

Я также пытался

   = form_for(resource, as: resource_name, url: saml_user_session_path(resource_name), html: {role: 'form'}) do |f|
    .form-group
      label for="email"  Email
      = f.email_field :email, autofocus: true, autocomplete: "email", class: 'form-control', placeholder: 'Email', id: 'email'
    .form-group
      label for="password"  Password
      = f.password_field :password, autocomplete: "off", placeholder: 'Password', class: 'form-control', id: 'password'
    button.btn.btn-info.btn-sm type="submit"  Submit
            | amp;nbsp;

  

Это выдает ошибку, неверный адрес электронной почты или пароль (я уверен, что это правильно).

Я сильно сомневаюсь, что я на правильном пути. Пожалуйста, укажите мне правильное направление. Большое вам спасибо!