Omniauth-Saml с отображением Devise и использованием атрибута

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

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

Вопрос:

Я довольно новичок в Rails, но у нас есть приложение, использующее Devise и Omniauth для аутентификации, и недавно мы интегрировали Omniauth-Saml, следуя документации Omniauth для интеграции Devise: https://github.com/omniauth/omniauth-saml#devise-integration Аутентификация работает, и мы можем создавать пользователей и использовать эти учетные записи без каких-либо проблем.

В атрибутах ответа SAML есть lacode (4-значная строка). Мы хотим проверить этот пользовательский атрибут на соответствие ссылочному коду lacode. Если их cag совпадает с ссылочным cag, мы хотим установить атрибут verified_at в модели user.rb.

Я обновил модель пользователя и проверил, установил ли я для oauth_lacode значение «9064», чтобы соответствовать oauth_lacode_ref, тогда код работает, и время и дата проверки пользователя устанавливаются в момент создания учетной записи.

app/models/user.rb

   # Get the existing user by email if the provider gives us a verified email.
  def self.first_or_initialize_for_oauth(auth)
    oauth_email           = auth.info.email
    oauth_email_confirmed = oauth_email.present? amp;amp; (auth.info.verified || auth.info.verified_email)
    oauth_lacode              = auth.extra.raw_info.lacode
    oauth_lacode_ref          = "9064"
    oauth_lacode_confirmed    = oauth_lacode == oauth_lacode_ref
    oauth_user            = User.find_by(email: oauth_email) if oauth_email_confirmed

    oauth_user || User.new(
      username:  auth.info.name || auth.uid,
      email: oauth_email,
      oauth_email: oauth_email,
      password: Devise.friendly_token[0, 20],
      terms_of_service: "1",
      confirmed_at: oauth_email_confirmed ? DateTime.current : nil,
      verified_at: oauth_lacode_confirmed ? DateTime.current : nil
    )
  end
 

Я неправильно отображаю и вызываю lacode из хэша, поскольку вижу эту ошибку в журнале «NoMethodError (неопределенный метод `lacode’ для #OneLogin ::RubySaml::Attributes:0x00007f7a5040ad40):»

Вот как я сопоставляю атрибуты в config/initializers/devise.rb

  attribute_statements: { email: ['urn:oid:0.9.2342.19200300.100.1.22'],
                                        lacode: ['urn:oid:0.9.2342.19200300.100.1.17']}
 

Я подтвердил с помощью IDP, что ‘urn: oid: 0.9.2342.19200300.100.1.17’ сопоставлен с кодом lacode в ответе SAML.

Как и в пользовательской модели выше, именно так я пытаюсь получить доступ к lacode из пользовательской модели. «saml_cag = auth.extra.raw_info.lacode»

Это руководство от Omniauth Saml:

:attribute_statements — используется для сопоставления имен атрибутов в SAMLResponse с записями в хэше информации OmniAuth. Например, если ваш SAMLResponse содержит атрибут с именем ‘EmailAddress’, укажите {:email => [‘EmailAddress’]}, чтобы сопоставить атрибут с соответствующим ключом в хэше информации. Также поддерживаются атрибуты с именами URI, например {:email => [‘http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress ‘]}. Примечание: все атрибуты также можно найти в массиве в разделе auth_hash[:extra][:raw_info], поэтому этот параметр следует использовать только для сопоставления атрибутов, которые являются частью хэш-схемы OmniAuth info .

Означает ли это предложение в конце, что мне не нужно / не могу сопоставить атрибут. Кто-нибудь может помочь или указать мне правильное направление?

Ответ №1:

Мне удалось заставить это работать. Можно использовать только имена атрибутов, указанные в хеш-схеме Omniauth.

Сопоставив lacode с description в инструкции атрибута, я смог получить к нему доступ, используя «auth.info.description»