#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»