Основная аутентификация с маркером Guid для REST api вместо имени пользователя/пароля

Обзор

Я разрабатываю мобильное приложение, использующее PhoneGap с REST API для бэкэнд. API REST не будет использоваться сторонними разработчиками, но будет специфичным для приложения, поэтому нет необходимости в выполнении oAuth. Следовательно, я планирую использовать базовую аутентификацию, в которой пользователь вводит свое имя пользователя/пароль для доступа к ресурсам API. Все сообщения API будут на SSL.

Основная аутентификация с помощью токена

Вместо того, чтобы позволить приложению хранить имя пользователя/пароль и отправлять его с каждым запросом API, я бы скорее аутентифицировал имя пользователя/пароль в первом запросе на вход и отправил маркер GUID обратно. Клиент сохраняет этот токен GUID и отправляет маркер обратно в API с каждым запросом через заголовок авторизации, например:

Авторизация: Basic e1d9753f-a508-46cc-a428-1787595d63e4

На стороне сервера комбинация имени пользователя /GUID будет храниться на сервере с датой истечения срока действия вместе с настройками устройства. Это позволит отслеживать количество устройств, в которые пользователь вошел в систему, а также истекает сеанс после истечения срока действия Guid.

Является ли этот подход разумным и безопасным?

Ответ 1

Общий подход "Аутентификация с помощью токена" очень хорош, но вы не должны пытаться сделать базовую аутентификацию по-другому, чем предполагалось (в конце концов это определенный стандарт). Вы должны использовать собственный заголовок для целей аутентификации. Здесь вы можете найти очень хорошее описание такого сценария:

Ответ 2

Вам не нужно создавать собственные заголовки или схемы аутентификации.

Схема аутентификации Bearer предназначена для вашего использования:

Authorization: Bearer e1d9753f-a508-46cc-a428-1787595d63e4

Basic Аутентификация должна быть следующей:

Authorization: Basic base64EncodedUsernameAndPassword

где base64EncodedUsernameAndPassword равно выходу:

base_64_encode(username + ':' + raw_password)

Не используйте Basic, если конечное текстовое значение не является указанным выше алгоритмом.

Если вы просто хотите поставить любое значение, которое вы хотите после имени схемы, используйте схему Bearer - это то, для чего она была изобретена.

Предупреждение

Хотя вы можете использовать простой GUID/UUID в качестве токена, это не действительно безопасный токен. Подумайте об использовании JWT. JWT могут быть подписаны цифровой подписью и назначены TTL, так что только серверный параметр может: a) создать его и подтвердить его подлинность и b) убедиться, что он не используется дольше, чем разрешено. Хотя это может быть справедливо для ваших данных, хранящихся на основе GUID, подход JWT не требует состояния сервера, поэтому он масштабируется намного лучше - и выполняет одно и то же.