SSO JWT - Передача групп

Я использую GitHub - discourse/discourse-jwt: Discourse Auth support for JSON Web Tokens (JWT) · GitHub для аутентификации с помощью кастомного сервиса JWT.

Это работает для входа пользователя, но передача ключа groups вроде бы ни на что не влияет. Я просмотрел код ManagedAuthenticator и тоже не нашёл ничего, связанного с группами.

Чего-то не хватает или я что-то неправильно понимаю?

Спасибо!

Вы ничего не упустили — плагин JWT не поддерживает передачу групп. Чтобы сделать это возможным, потребуется доработка самого плагина.

@david Как ты думаешь, насколько это сложно для человека, который ещё не писал плагины? Разве это не так просто, как получить по имени группы из JWT, пришедшие из Discourse, и присвоить результат запроса (объекты групп) user.groups? Я немного знаком с плагином (насколько он прост) и, возможно, смогу это сделать.

Также, стоит ли вообще этим заниматься? Если у меня есть на руках JWT, могу ли я аутентифицироваться через OpenID Connect?

Это зависит от того, как вы хотите, чтобы это работало… Скорее всего, вы захотите создавать обычные группы в Discourse, не допуская случайного удаления из них участников с помощью JWT. В нашей нативной системе SSO для Discourse это решается с помощью двух параметров: «add groups» (добавлять группы) и «remove groups» (удалять группы).

https://github.com/discourse/discourse/blob/master/app/models/discourse_single_sign_on.rb#L159-L179

В плагине JWT эту логику, вероятно, стоит добавить в функцию after_authenticate аутентификатора. Обязательно вызовите super и верните его ответ, чтобы всё существующее продолжало работать корректно. Пример такого переопределения можно найти здесь.

Отлично! Это именно то, что мне нужно; я смогу разобраться с остальным сам. Спасибо!

Вы продвинулись с этим? Интересно, как реализовать SSO, используя только JWT?

Плагин discourse-jwt работает. Однако, похоже, что по какой-то причине он предназначен только для работы с алгоритмом HS256. Внести изменения для поддержки других алгоритмов довольно просто.

Вы можете посмотреть репозиторий, с которым я экспериментировал: discourse-jwt/plugin.rb at master · arivanandan/discourse-jwt · GitHub