Возможно ли отправить ссылку для входа по электронной почте через API?

Привет! Мне очень нравится использовать API Discourse!

Следуя руководству по реверс-инжинирингу API, я столкнулся с проблемой при попытке заставить API отправлять ссылку для входа.

Контекст
Я создал сервис SSO для местного хакерспейса, чтобы пользователи могли входить в наш Discourse через систему членства хакерспейса.

Однако некоторые люди могли использовать в системе членства другой адрес электронной почты, чем в Discourse. Поскольку локальный вход отключен при включенном SSO, я хочу, чтобы пользователи могли нажать кнопку «Отправить мне ссылку для входа по электронной почте», чтобы войти в систему, а затем при желании обновить свой адрес электронной почты (или продолжать использовать ссылку для входа — как удобнее).

Цель
Я хочу отправить ссылку для входа пользователю user@domain.co.uk через API.

Я попробовал следующее:

curl -X POST "https://discourse.<site>.org.uk/u/email-login" --data "{\"login\":\"user%40domain.co.uk\"}" -H "Api-Key: xxxxx" -H "Api-Username: system" -H "Content-Type: application/json"

В ответ я получаю:

<html><body>Вы будете перенаправлены <a href="https://discourse.<site>.org.uk/">здесь</a>.</body></html>

Если не указывать API-ключ, возвращается ошибка [BAD CSRF].

Итак, в чём моя проблема: как заставить Discourse отправить ссылку для входа пользователю user@domain.co.uk через API?

Большое спасибо за любую помощь! Я продолжу экспериментировать и проверю, что сработает.


P.S. Я бы не хотел использовать такие хаки, как:

  1. Сделать запрос к /session/csrf и сохранить CSRF-токен.
  2. Затем сделать запрос к /u/email-login с этим токеном.

Возможно ли сделать это только с помощью API-ключа?

Спасибо!
:slight_smile:

Просто уточню: является ли использование маршрута CSRF, за которым следует маршрут ссылки по электронной почте, правильным способом?

Нет ли в API реализации этого при предоставлении API-ключа?

Как ваш сервис SSO взаимодействует с Discourse? Если вы используете DiscourseConnect, то, как я понимаю, конечная точка /u/email-login будет отключена.

Спасибо за ваш ответ. Да, действительно используется Discourse Connect.

Я тоже так подумал, поэтому отключил Discourse Connect и попытался получить ссылку для входа, но у меня не получилось, и именно так я получил вывод в моём посте выше.

Если получение ссылки по электронной почте отключено при включённом Discourse Connect, мне придётся пересмотреть свой подход к связыванию учётных записей из сервиса SSO системы членства с Discourse.

Самый простой способ, как вы уже отметили, — сопоставление учётных записей по адресу электронной почты. Если это невозможно, мы используем несколько подходов:

  1. Сопоставление пользователей по другому уникальному идентификатору. Вы можете заранее создать ассоциации DiscourseConnect для пользователя через консоль. Это сработает только в том случае, если у вас есть другой идентификатор, который одинаков в Discourse и у провайдера идентификации.

  2. (наиболее распространённый) разрешить пользователям регистрировать новые учётные записи, а затем попросить их написать администратору с просьбой «объединить» новую учётную запись со старой (используя кнопку в нижней части страницы управления пользователем). Это автоматически сопоставит адреса электронной почты и создаст ассоциацию DiscourseConnect.

Спасибо за ваш ответ.

Вероятно, я выберу подход с объединением аккаунтов.

Было бы здорово, если бы этот процесс можно было выполнить самостоятельно — например, через API, где пользователи могут войти по ссылке из письма, а затем обновить свой адрес электронной почты для синхронизации двух аккаунтов.
Или, возможно, разрешив пользователю аутентифицироваться, предоставив свой адрес электронной почты и пароль от Discourse, а также новый адрес электронной почты.

Еще раз спасибо за ваше время.