@jomaxro, спасибо. Возможно, меня сбило с толку то, что я попытался установить enforce_second_factor в значение “all”, но не смог, так как получил сообщение: “Вы не можете принудительно включать 2FA, если локальные входы отключены”. Если это не слишком оффтоп, в чём решение этой проблемы?
Итак, меня поправила команда. Discourse ID действительно использует OAuth2 «под капотом» — приношу свои извинения. Я думал, что используется другой протокол.
Отвечая на ваш вопрос: мы не поддерживаем двухфакторную аутентификацию (2FA) при использовании внешних способов входа. Как указано в сообщении, которое вы видели, принудительное применение 2FA невозможно без включения локального входа. Мы полагаемся на провайдера внешнего входа (в данном случае Discourse ID, но это относится ко всем внешним провайдерам) в вопросах управления 2FA, включая его принудительное применение.
Вопрос к нам: передаёт ли IdP в SP информацию о том, выполнил ли пользователь многофакторную аутентификацию (MFA)?
Я думаю об аналогичном механизме U2F / FIDO — программа может запросить у устройства подтверждение (аттестацию) относительно уровня взаимодействия пользователя, который ожидается или требуется для учётных данных.
Если Discourse ID… или любой другой IdP (SAML? OAuth2? OIDC?) передаёт эту информацию в SP, это может стать данными, которые мы потенциально сможем использовать.
Если нет, то нам, по сути, придётся реализовать MFA после федеративного входа, чтобы получить эту гарантию.
Стандартный способ реализации этого — через OIDC. На данный момент Discourse ID построен исключительно на OAuth2. Для поддержки флага MFA нам потребуется внедрить OIDC на уровне провайдера и передавать значения MFA туда и обратно для клиентов, которым это необходимо.
Существует несколько сложностей:
В ядре Discourse есть возможность требовать 2FA только для определённых типов пользователей (сотрудников или всех); вероятно, нам потребуется аналогичная поддержка через ID.
ID позволяет вход через Google/Apple/Facebook/Github, но они не всегда надёжно сообщают, завершил ли пользователь 2FA при входе… Возможно, нам придётся реализовать 2FA на уровне ID, а также, вероятно, потребовать двойную 2FA для некоторых пользователей, что не является идеальным решением.
Достаточно ли 2FA на уровне провайдера идентификации (то есть не на локальном экземпляре) для всех потребителей? В общем случае я считаю, что да, но прежде чем принимать решение, нам нужно провести дополнительное исследование.