С давних пор для второго шага аутентификации мы использовали одноразовые пароли отправляемые через СМС. Такой функционал появился в Redmine в 2013, когда мы разработали плагин redmine_sms_auth. Об этом мы писали в давней статье.
Но время не стоит на месте. Мы активно внедряем Telegram в бизнес-процессы компании (раз, два, три).
В связи с этим решили сделать аутентификацию через Telegram в Redmine. Заодно с этим переписать старый плагин про СМС и добавить поддержку Google Authenticator.

Далее мы расскажем о том как установить, настроить и использовать этот плагин.
Установка
Заходим в папку с плагинами
cd plugins
Клонируем репозиторий
git clone https://github.com/centosadmin/redmine_2fa.git
Переходим в корень Redmine
cd ..
Устанавливаем нужные гемы
bundle install
Выполняем миграции
rake redmine:plugins:migrate
Дополняем конфиг config/configuration.yml
# specific configuration options for production environment
# that overrides the default ones
production:
redmine_2fa:
sms_command: 'echo %{phone} %{password}'
в sms_command
впишите системную команду, которой будут отправляться сообщения.
Такой подход используется для совместимости с большинством API СМС-шлюзов. Скорее всего в вашем случае будет что-то вроде
/usr/bin/curl "https://sms.ru/api/send?phone=%{phone}&message=code: %{password}"
Перезапускаем Redmine.
Настройка
Предварительные требования
Так как веб-хуки от Telegram отправляются только на HTTPS адреса, ваш Redmine должен быть настроен на использование этого протокола.
Обязательное использование
По-умолчанию отключено, чтоб после установки плагина вы могли выбрать “не использовать” и войти в Redmine.
Но лучше включить, дабы случайные прохожие, узнавшие пароль одного из пользователей не смогли войти в систему.

Настройка Telegram
Для аутентификации через Telegram нужно завести отдельного бота. Бота создаём с помощью @BotFather. Инструкция по созданию бота.

Полученный от него ключ вводим в настройки и нажимаем Применить.
Инициализация бота
После того как токен сохранён, нужно инициализировать бота.

При инициализации в систему будет загружено имя бота, чтоб показать ссылку на него на шаге инициализации.
Также будет установлен веб-хук — адрес на который будут приходить запросы от API в случае, если кто-то напишет боту.
В прежних плагинах мы использовали бото-процессы, так как там большой входящий трафик.
Тут же решили исключить лишний элемент из системы.
Важно! При смене токена нужно Инициализировать бота ещё раз.
Деактивация бота
Данная функция пригодится если
- вы решите использовать этого бота где-то ещё
- по каким-то причинам вам нужно перейти на другого бота.

В процессе деактивации сбрасывается токен и деактивируются все пользователи, использующие плагин.
При следующем входе в систему им нужно будет добавить себе в контакты нового бота.
Важно! Не забудьте активировать бота, когда введёте и сохраните новый токен.
А как это со стороны пользователя?
Первый вход
При первом входе пользователь может выбрать один из способов аутентификации либо отказаться от использования второго фактора.

Отказаться он сможет только в том случае, если вы разрешили это в настройках плагина.
Telegram

После команды /start бот сохранит в Redmine ваш аккаунт Telegram и предложит связать его с вашим аккаунтом в Redmine

Вводим предложенную команду

И получаем на почту письмо

При переходе по ссылке увидим сообщение
и форму логина.
Нужно ввести логин и пароль ещё раз.
После чего увидим форму ввода одноразового пароля

и получим заветный код от бота

Настройка Telegram — самая сложная. Но ради удобства в использовании минуту потратить не жалко.
Google Auth
Аутентификация через гугл настраивается проще всего. Сосканируйте QR-код в приложении и нажмите “Далее”.

SMS
Для получение кодов через СМС нужно сперва подтвердить номер телефона, на который вы будете получать СМС с одноразовыми паролями.

Миграция со старого плагина
Если вы пользовались нашим старым плагином, то лучше перейти с него на новый. Подробная инструкция о переходе доступна здесь.
Сброс настроек 2FA
Может случиться что пользователь захочет сменить способ аутентификации. На его странице есть специальная ссылка для этого.

После сброса настроек при следующем логине пользователю будет предложено выбрать способ аутентификации.
Что дальше?
Теперь вы знаете как добавить двухфакторную аутентификацию в Redmine. Самое время применить полученные знания на практике.
На вопросы о плагине готовы ответить в комментариях к этой публикации.
Запросы о расширении функционала и баг-репорты принимаются здесь же, а также в тикетах репозитория.
Автор: Centos-admin.ru