Click to sign into the desktop app
Давно поднималась идея с тем, чтобы сделать возможность входить в десктопное приложение через клик по ссылке из браузера. Тогда, основным ограничителем была невозможность передать напрямую какие-то данные из core в desktop приложение, однако сейчас у нас есть почти что нормальная дистрибьюция приложения под Windows & macOS, да и для Linux можно что-нибудь придумать, поэтому можно таки попробовать сделать это через application protocol.
Основная проблема в том, что нужно выработать какой-то протокол для этого. Пока мне кажется наиболее простым такой вариант:
- Пользователь кликает по кнопке "Authenticate in Desktop app" где-то на фронте
- Бэкенд генерирует аутентификационный JWT-токен для этого пользователя и отдаёт его в респонсе фронту
- Фронт подставляет этот токен + урл до сервера в адрес вроде
cattr://authenticate?url={urlencoded урл до сервера}&token={urlencoded токен аутентификации}
- Фронт пытается перейти по этой ссылке, триггеря браузер на использование этого application protocol
- Приложение обрабатывает запрос, и показывает диалог вроде "Подтвердите вход в myacme.corp" с кнопкой "войти" и "отменить"
Проблема этого варианта в том, что неиспользованный токен будет торчать в системе вечно, ну или придётся городить какую-нибудь дичь, вроде инвалидации токена если он ни разу не использовался в течении X секунд. Альтернативой этому, можно выдавать вместо готового токена что-то вроде authorization code как это сделано в OAuth. Вместо токена, сервер генерирует и отдаёт некий секрет, который долетает до десктопной приложухи, которая тыкает сервер и меняет секрет на полноценный токен. Тогда можно не возиться с инвалидацией JWT, а просто удалять authorization codes из базы по планировщику, например, если его не использовали в течении часа.