Огляд
Я хочу створити (REST) API для своєї програми. Початкова / основна мета буде споживатися мобільними додатками (iPhone, Android, Symbian тощо). Я розглядав різні механізми аутентифікації та авторизації веб-API (шляхом вивчення інших реалізацій). У мене голова обернута навколо більшості фундаментальних концепцій, але все ще шукаю настанови в кількох сферах. Останнє, що я хочу зробити, - це винаходити колесо, але я не знаходжу жодного стандартного рішення, яке б відповідало моїм критеріям (проте мої критерії мої неправильно керуються, тому також сміливо критикую це). Крім того, я хочу, щоб API був однаковим для всіх платформ / додатків, які його використовують.
oAuth
Я продовжую викидати заперечення проти oAuth, оскільки знаю, що це, ймовірно, буде першим запропонованим рішенням. Для мобільних додатків (а точніше не веб-додатків) просто здається неправильним залишати програму (перейти на веб-браузер) для аутентифікації. Крім того, немає можливості (я знаю) для браузера, щоб повернути зворотний виклик додатку (особливо кросплатформенному). Я знаю пару програм, які роблять це, але це просто почувається не так і дає перерву в додатку UX.
Вимоги
- Користувач вводить ім'я користувача / пароль у програму.
- Кожен дзвінок API ідентифікується програмою для виклику.
- Накладні витрати зведені до мінімуму, а авторський аспект інтуїтивно зрозумілий для розробників.
- Механізм захищений як для кінцевого користувача (їх вхідні дані не піддаються впливу), так і розробника (їх облікові дані не піддаються).
- Якщо можливо, не вимагайте https (аж ніяк не жорсткі вимоги).
Мої поточні думки про реалізацію
Зовнішній розробник запитає акаунт API. Вони отримають апікею та апісекрет. Кожен запит вимагатиме як мінімум трьох параметрів.
- apikey - надається розробнику при реєстрації
- мітка часу - являє собою унікальний ідентифікатор для кожного повідомлення для даної apikey
- хеш - хеш часової позначки + апісекрет
Apikey необхідний для ідентифікації програми, що видає запит. Часова позначка діє аналогічно oauth_nonce і уникає / пом'якшує повторні атаки. Хеш гарантує, що запит був фактично виданий від власника заданої apikey.
Для аутентифікованих запитів (зроблених від імені користувача) я все ще не вирішу між переходом маршруту access_token або комбінованим хешем імені користувача та паролем. Так чи інакше, в якийсь момент буде потрібно комбінація імені користувача / пароля. Тож, коли це станеться, буде використано хеш із кількох відомостей (apikey, apisecret, часова мітка) + пароль. Я хотів би отримати відгуки щодо цього аспекту. FYI, спочатку їм доведеться хеш-пароль, оскільки я не зберігаю паролі у своїй системі без хешування.
Висновок
FYI, це не запит про те, як створити / структурувати API взагалі, лише як керувати автентифікацією та авторизацією виключно в межах програми.
Випадкові думки / бонусні питання
Як для API, які вимагають лише apikey як частину запиту, як ви заважаєте, щоб хтось, крім власника apikey, не міг бачити apikey (оскільки він надсилається в ясні місця) та надсилає надмірні запити, щоб пересувати їх за межі використання? Можливо, я просто замислююся над цим, але чи не повинно бути щось, щоб засвідчити, що запит було підтверджено власником apikey? У моєму випадку, це і було метою апісекрету, він ніколи не показується / передається без хеширования.
Якщо говорити про хеші, що з md5 vs hmac-sha1? Невже це має значення, коли всі значення хешируються досить тривалими даними (наприклад, apisecret)?
Раніше я розглядав можливість додавання солі на кожного користувача / рядок у хеш для паролів користувачів. Якби я це зробив, як програма могла б створити відповідний хеш, не знаючи використовуваної солі?