Не получается корректное сопоставление атрибутов с помощью плагина SAML

Здравствуйте,

Я пытаюсь интегрировать наш Shibboleth с экземпляром Discourse. На данный момент вход в систему работает, но я получаю неверные данные (имя, электронная почта и т. д.).

Вот часть данных, поступающих от SSO:

    <saml2:Attribute FriendlyName="givenName" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
      <saml2:AttributeValue>Joao Miguel</saml2:AttributeValue>

Вот лог ошибки:

SAML Debugging: saml_auth: {:uid=>"AAdzZWNyZXQ0uudwQFYHs1n7nrvB/A4t4l6q+6aAXInZRL4XIO+mnEEEq4t8UwBnzJRh50mnTGDsQAPvWThJNaUNR6smCochT1I2oXwvyoU4lQG+5hbVmCvkkmYDPOujrvgNloXWNg==", :info=>{"name"=>nil, "email"=>nil, "first_name"=>nil, "last_name"=>nil, "nickname"=>nil}.......   @attributes={............."urn:oid:2.5.4.42"=>["Joao Miguel"]

Я полагаю, что проблема связана с атрибутом FriendlyName, так как он не совпадает ни с одним из вариантов в файле saml_authenticator.rb:

statements = “name:name|email:email,mail|first_name:first_name,firstname,firstName|last_name:last_name,lastname,lastName|nickname:screenName”

Поскольку FriendlyName повторяется для каждого атрибута, я не уверен, как настроить сопоставление. У кого-нибудь есть идеи, как с этим справиться?

Спасибо

Удалось ли вам это настроить?

Привет @Ivan.bacher и @JoreisPy, удалось ли успешно сопоставить нужные атрибуты через конфигурацию discourse-saml?

Я пробовал использовать эту конфигурацию в плагине, но пока безрезультатно:

Удачи! :slight_smile:

Я столкнулся с той же проблемой при тестировании интеграции SAML и наконец смог её решить. С включёнными логами проверьте содержимое @attributes — это именно те ключи, которые нужны для сопоставления, а не дружественные имена. Они соответствуют атрибуту Name из XML-данных. В моём случае сопоставление в файле app.yml выглядело так:

DISCOURSE_SAML_REQUEST_ATTRIBUTES: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
DISCOURSE_SAML_ATTRIBUTE_STATEMENTS: "email:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"

Также важно выполнить пересборку после внесения изменений в конфигурацию. После этого значение email из моего SAML-ответа было корректно сопоставлено.

Спасибо за пример. Из discourse-saml/config/locales/server.en.yml at main · discourse/discourse-saml · GitHub неясно, что именно означает указанный формат. Кроме того, для будущего плагина SAML предусмотрена возможность сопоставления нескольких атрибутов с переменной Discourse, поэтому формат по сути указывает:

‘<переменная_Discourse>:<атрибут_SAML1>,<атрибут_SAML2>’

Вероятно, это не самое подходящее место, но просто добавлю: для использования плагина SAML вам понадобятся атрибуты, аналогичные атрибутам Discourse: email, name, first_name, last_name и uid.

Кроме того,

def attribute_statements
    result = {}
    statements =
      "name:fullName,name|email:email,mail|first_name:first_name,firstname,firstName|last_name:last_name,lastname,lastName|nickname:screenName"
    custom_statements = setting(:attribute_statements)

    statements = "#{statements}|#{custom_statements}" if custom_statements.present?

    statements
      .split("|")
      .map do |statement|
        attrs = statement.split(":", 2)
        next if attrs.count != 2
        (result[attrs[0]] ||= []) << attrs[1].split(",")
        result[attrs[0]].flatten!
      end

    result
  end

эта часть кода (учитывая, что я не программист на Ruby) предполагает, что вам нужно сопоставить все атрибуты с теми атрибутами, с которыми система может работать… Я попробую проверить эту информацию (в данный момент у меня возникла проблема с плагином SAML, и я пытаюсь её исследовать).