#rest #authentication #web #command-line-interface #protocols
Вопрос:
У меня есть интерфейс командной строки (который использует api rest), для использования которого требуется аутентификация. На данный момент он поддерживает аутентификацию по токену. Этот токен генерируется на сервере по запросу с именем пользователя и паролем и выдается в качестве ответа.Это не идеально (из-за атак man in the middle), и я ищу лучший протокол для использования для генерации токенов.
Пользователи будут использовать такой протокол из интерфейса командной строки и могут иметь или не иметь доступа к браузеру на том же устройстве (хотя протокол, требующий открытия веб-сайта, не является проблемой).
Поток устройств OAuth кажется очень простым в использовании, но он предназначен для авторизации, а не для аутентификации. Я также хочу поддержать OAuth, так как это потребует много работы, и, честно говоря, не то, что мне нужно.
Какой стандартный или рекомендуемый протокол следует использовать в такой ситуации?
Ответ №1:
MITM не должен быть проблемой, если ваш сервер и приложение должным образом защищают соединение. На самом деле нет ничего плохого в использовании имени пользователя пароля для подключения к вашим внутренним службам. В конце концов, когда вы входите на сайт, вы отправляете HTTP-запрос с вашим именем пользователя и паролем на серверную часть так же, как это сделало бы ваше приложение cli.
Но OAuth действительно может лучше подойти для приложения cli:
- проще отозвать украденный токен OAuth, чем заставить пользователя изменить пароль,
- приложению не нужно иметь дело с учетными данными пользователя (хотя поток учетных данных OAuth также существует).,
- это дает вам гибкость при создании новых токенов. Например, вы можете захотеть выдавать токены с коротким сроком действия только для того, чтобы заставить пользователя повторно входить в систему при каждом использовании приложения, или вы можете захотеть использовать токены с длительным сроком действия для обновления.
Как вы уже упоминали, OAuth не обрабатывает аутентификацию, но вы можете использовать свой текущий поток входа в систему для проверки учетных данных пользователя и выдачи токена OAuth (как именно это сделать-отдельная тема).
Я не думаю, что в приложениях cli существует специальный протокол, предназначенный для аутентификации. В любом случае приложению потребуется отправить какой-то секрет на серверную часть. Одним из возможных решений является использование OTP (например, SMS или код электронной почты). В этом случае вы отправляете код так же, как отправили бы пароль, но он лучше защищен от атак MITM, поскольку код нельзя использовать более одного раза.