Обзор
Я разрабатываю мобильное приложение, использующее 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 не требует состояния сервера, поэтому он масштабируется намного лучше - и выполняет одно и то же.