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