Я размышляю о том, целесообразно ли разрешить клиентам user api key регистрировать валидный auth_redirect для целей создания ключей.
Текущая функциональность
В настоящее время редиректы для пользовательских API-ключей должны регистрироваться хост-сайтом в настройке сайта allowed_user_api_auth_redirects. Любой auth_redirect, отправленный с запросом на создание ключа, проверяется по этому списку настроек сайта (см. здесь). Это разумная мера защиты от открытых редиректов, которые создают различные риски для безопасности.
Эффективная причина
Эффективной причиной для такого рассмотрения является функция авторизации пользователей плагина ActivityPub. Она позволяет пользователю подтвердить владение актером ActivityPub, чтобы действия этого актера могли быть связаны с его учетной записью на данном инстансе. Вот как это выглядит:
В настоящее время это работает с Mastodon, поскольку каждый сервер Mastodon является провайдером OAuth, который позволяет программно создавать OAuth-клиенты. Процесс выглядит следующим образом:
- Пользователь указывает домен Mastodon, на котором находится его учетная запись.
- Если это первый раз авторизации на этом домене, плагин создает OAuth-приложение на этом сервере Mastodon, регистрируя свои редиректы и получая учетные данные клиента для OAuth-потока.
- Плагин выполняет OAuth-поток с пользователем, используя созданное (или ранее созданное) в пункте 2 OAuth-приложение.
Цель — реализовать аналогичную функциональность в Discourse с помощью пользовательских API-ключей. Это уже реализовано в данном PR:
Этот процесс требует, чтобы хост-сайт заранее добавил домен или редирект клиента в allowed_user_api_auth_redirects.
Возможное изменение
Сейчас я думаю о создании PR для discourse/discourse, который бы выполнял следующее:
Создание таблицы user_api_key_client
Колонки:
client_idиapplication_name, перенесенные изuser_api_keyredirect_uri(необязательно)public_key(необязательно)
Вся существующая функциональность, использующая client_id и application_name, будет работать как прежде, через user_api_key_client.
Добавление маршрута для регистрации клиента
post "/user-api-key/register" => "user_api_keys#register"
Обязательные параметры:
application_nameclient_idpublic_keyauth_redirect
Действие:
- Валидация и сохранение параметров в
user_api_key_client - Возврат кода успеха в случае успеха
Разрешение использования зарегистрированных клиентов в действиях создания
Изменить действие create в контроллере UserApiKey следующим образом:
- Если
client_idсуществует вuser_api_key_clientи имеет Иauth_redirect, Иpublic_key:- Проверить использование
auth_redirectс сохраненнымauth_redirect - Использовать сохраненный
public_keyдля шифрования возвращаемой полезной нагрузки
- Проверить использование
- В противном случае следовать существующей функциональности.
cc @pmusaraj