Я все еще пытаюсь найти лучшее решение для защиты API REST, потому что количество мобильных приложений и API растет с каждым днем.
Я пробовал разные способы аутентификации, но все еще есть некоторые недоразумения, поэтому мне нужен совет кого-то более опытного.
Позвольте мне рассказать, как я понимаю все эти вещи. Если я что-то неправильно понимаю, пожалуйста, дайте мне знать.
Поскольку REST API не имеет состояния, а также WEB в целом, нам необходимо отправлять некоторые данные аутентификации в каждом запросе (куки, токен ....). Я знаю три широко используемых механизма аутентификации пользователя
Токен с HTTPS. Я использовал этот подход много раз, он достаточно хорош с HTTPS. Если пользователь предоставит правильный пароль и логин, он получит токен в ответ и будет использовать его для дальнейших запросов. Токен генерируется сервером и сохраняется, например, в отдельной таблице или там же, где хранится информация о пользователе. Таким образом, для каждого сервера запросов проверяется, есть ли у пользователя токен, и он такой же, как в базе данных. Все довольно просто.
JWT Token. Этот токен является информативным, он содержит всю необходимую информацию о самом токене, пользователь не может изменить, например, дату истечения срока действия или любую другую заявку, поскольку этот токен генерируется (подписывается) сервером с секретным ключевым словом. Это тоже понятно. Но одна большая проблема, лично для меня, как аннулировать токен.
OAuth 2. Я не понимаю, почему этот подход следует использовать, когда связь устанавливается непосредственно между сервером и клиентом. Насколько я понимаю, OAuth-сервер используется для выдачи токена с ограниченной областью действия, чтобы другие приложения могли получать доступ к пользовательской информации без сохранения пароля и логина. Это отличное решение для социальных сетей, когда пользователь хочет зарегистрироваться на какой-либо странице, сервер может запросить разрешения на получение информации о пользователе, например, из твиттера или Facebook, и заполнить поля регистрации данными пользователя и так далее.
Рассмотрим мобильный клиент для интернет-магазина.
Первый вопрос: я должен предпочесть JWT токену первого типа? Поскольку мне нужно войти / выйти из системы на мобильном клиенте, мне нужно где-то хранить токен или, в случае JWT, токен должен быть аннулирован при выходе из системы. Для аннулирования токена используются разные подходы. Одним из них является создание списка недействительных токенов (черный список). Хм. Таблица / файл будет иметь гораздо больший размер, чем если бы токен хранился в таблице и был связан с пользователем и был удален при выходе из системы.
Так каковы преимущества токена JWT?
Второй вопрос о OAuth, должен ли я использовать его в случае прямой связи с моим сервером? Какова цель еще одного слоя между клиентом и сервером только для выдачи токена, но связь будет осуществляться не с oauth-сервером, а с главным сервером. Как я понимаю, сервер OAuth отвечает только за предоставление сторонним приложениям разрешений (токенов) для доступа к личной информации пользователя. Но мое мобильное клиентское приложение не стороннее.