Обзор
Я ищу, чтобы создать (REST) API для моего приложения.Первоначальное / основное назначение будет предназначаться для мобильных приложений (iPhone, Android, Symbian и т. Д.).Я изучал различные механизмы аутентификации и авторизации для веб-интерфейсов API (изучая другие реализации).Я обернул голову вокруг большинства фундаментальных понятий, но все еще ищу руководство в нескольких областях.Последнее, что я хочу сделать, - это заново изобрести колесо, но я не нахожу никаких стандартных решений, которые бы соответствовали моим критериям (однако мои критерии могут быть ошибочными, поэтому не стесняйтесь критиковать и это).Кроме того, я хочу, чтобы API был одинаковым для всех платформ / приложений, использующих его.
oAuth
Я опущу свое возражение против oAuth, поскольку знаю, что, скорее всего,первое предложенное решение.Для мобильных приложений (или, в частности, не веб-приложений), просто неправильно оставлять приложение (переходить в веб-браузер) для аутентификации.Кроме того, браузер не может (как я знаю) вернуть обратный вызов приложения (особенно кроссплатформенный).Я знаю пару приложений, которые делают это, но он просто чувствует себя неправильно и дает перерыв в UX приложения.
Требования
- Пользователь вводит имя пользователя / пароль в приложение.
- Каждый вызов API идентифицируется вызывающим приложением.
- Издержки сводятся к минимуму, а аспект аутентификации интуитивно понятен для разработчиков.
- Механизм безопасен как для конечного пользователя.(их учетные данные не раскрываются), а также разработчик (их учетные данные приложения не предоставляются).
- Если возможно, не требуется https (ни в коем случае не жесткое требование).
Мои текущие мысли о реализации
Внешний разработчик запросит учетную запись API.Они получат apikey и apisecret.Для каждого запроса требуется как минимум три параметра.
- apikey - предоставляется разработчику при регистрации
- timestamp - дублируется как уникальный идентификатор для каждого сообщения для данного apikey
- hash - хэш метки времени + apisecret
Apikey требуется для идентификации приложения, отправляющего запрос.Временная метка действует аналогично oauth_nonce и предотвращает / смягчает атаки воспроизведения.Хеш гарантирует, что запрос был действительно выдан владельцем данного apikey.
Для аутентифицированных запросов (сделанных от имени пользователя) я все еще не определился между переходом по маршруту access_token или по имени пользователя.и пароль хэш-комбо.В любом случае, в какой-то момент потребуется имя пользователя и пароль.Поэтому, когда это произойдет, будет использован хеш из нескольких частей информации (apikey, apisecret, timestamp) + пароль. Мне бы очень понравилась обратная связь по этому аспекту. К вашему сведению, сначала им придется хэшировать пароль, поскольку я не храню пароли в моей системе без хэширования.
Заключение
К вашему сведению, это не запрос о том, как создать / структурировать API в целом, а только как обрабатывать аутентификацию и авторизацию исключительно внутри приложения.
Случайные мысли / Бонусные вопросы
Для API, которым требуется только apikey как часть запроса, как вы препятствуете тому, чтобы кто-то, кроме владельца apikey, мог видеть apikey (с момента его отправки в открытом виде) и делать чрезмерные запросы, чтобы вывести их за пределы использования?Может быть, я просто обдумываю это, но не должно ли быть что-то, что могло бы подтвердить, что запрос был подтвержден владельцу apikey?В моем случае это было целью apisecret, он никогда не показывается / не передается без хэширования.
Говоря о хешах, как насчет md5 против hmac-sha1?Действительно ли имеет значение, когда все значения хэшируются с достаточно длинными данными (например, apisecret)?
Раньше я думал о добавлении соли для каждого пользователя / строки в мой хэш пароля пользователя. Если бы я сделал это, как приложение могло бы создать соответствующий хеш, не зная, какую соль использовали?