Я разрабатываю HTTP API для нашего веб-приложения. Первоначально основным потребителем API будет приложение для iPhone, которое мы разрабатываем, но я разрабатываю его с учетом будущего использования (например, мобильных приложений для других платформ). Я пытаюсь выбрать лучший способ аутентификации пользователей, чтобы они могли получить доступ к своим учетным записям с iPhone. У меня есть дизайн, который, как мне кажется, работает хорошо, но я не эксперт по безопасности, поэтому я подумал, что было бы хорошо попросить обратную связь здесь.
Дизайн аутентификации пользователя имеет 3 основных цели:
- Хороший пользовательский опыт : мы хотим разрешить пользователям вводить свои учетные данные один раз и оставаться в системе неограниченное время до тех пор, пока они явно не выйдут из системы. Я бы рассмотрел OAuth, если бы не тот факт, что приложение для iPhone довольно ужасно, из того, что я слышал (т. Е. Оно запускает форму входа в Safari, а затем говорит пользователю вернуться в приложение, когда аутентификация прошла успешно) .
- Нет необходимости хранить пользовательские кредиты с приложением : я всегда ненавижу идею хранить пароль пользователя в виде простого текста или симметрично зашифрованного в любом месте, поэтому я не хочу, чтобы приложение имело сохранить пароль для передачи его в API для будущих запросов API.
- Безопасность : Нам определенно не нужна строгая безопасность банковского приложения, но я бы, очевидно, хотел, чтобы это было безопасно.
В целом, API основан на REST (то есть обрабатывает URL-адреса как ресурсы и семантически использует методы HTTP и коды состояния). Каждый запрос к API должен включать два пользовательских заголовка HTTP: ключ API (уникальный для каждого клиентского приложения) и уникальный идентификатор устройства. API требует, чтобы все запросы выполнялись с использованием HTTPS, чтобы заголовки и тело были зашифрованы.
Текущая стратегия:
Мой план состоит в том, чтобы в моей базе данных была таблица api_sessions . Он имеет уникальное ограничение на ключ API и уникальный идентификатор устройства (так что устройство может быть зарегистрировано только в одной учетной записи пользователя через данное приложение), а также внешний ключ к таблице пользователей.
API будет иметь конечную точку login , которая получает имя пользователя / пароль и, если они соответствуют учетной записи, регистрирует пользователя, создавая запись api_sessions для данного ключа API и идентификатора устройства. Будущие запросы API будут искать api_session, используя ключ API и идентификатор устройства, и, если запись найдена, обрабатывать запрос как входящий в систему под учетной записью пользователя, на которую ссылается запись api_session.
Также будет конечная точка API logout , которая удалит запись из таблицы api_sessions.
Кто-нибудь видит в этом очевидные дыры в безопасности?