При разработке REST API обычно сначала выполняется аутентификация пользователя?
Типичный пример использования, который я ищу:
- Пользователь хочет получить данные.Конечно круто, мы хотели бы поделиться!Получите открытый ключ API и прочитайте!
- Пользователь хочет сохранить / обновить данные ... вау, подождите!кто вы, можете ли вы сделать это?
Я хотел бы собрать его один раз и разрешить использовать его, скажем, в веб-приложении, приложении для Android или приложении для iPhone.REST API представляется логичным выбором с такими требованиями:
. Для иллюстрации моего вопроса я приведу простой пример.
У меня есть элемент в базе данных, который имеет рейтинг атрибут (целое число от 1 до 5).
Если я правильно понимаю REST, я бы реализовал запрос GET, используя язык по своему выбору, который возвращает csv, xml или json, например:
http://example.com/product/getrating/{id}/
Скажем, мы выбираем JSON и возвращаем:
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
Это хорошо для общедоступных API.Я получил эту часть.
Где у меня тонны вопросов, как мне совместить это с моделью безопасности?Я привык к безопасности веб-приложений, когда у меня всегда есть состояние сеанса, идентифицирующее моего пользователя, поэтому я могу контролировать, что они могут делать, независимо от того, что они решат отправить мне.Насколько я понимаю, это не RESTful, поэтому в данном случае это будет плохое решение.
Я попытаюсь использовать другой пример, используя тот же предмет / рейтинг.
Если пользователь "JOE"хочет добавить рейтинг к элементу
Это можно сделать с помощью:
http://example.com/product/addrating/{id}/{givenRating}/
На данный момент я хочу сохранитьданные о том, что "JOE" дал продукту {id} рейтинг {даноРейтинг}.
Вопрос: Как узнать, что запрос поступил от "JOE", а не от "BOB".
Более тогоЧто, если это было бы для более разумных данных, таких как номер телефона пользователя?
Что я получил до сих пор:
1) Используйте встроенную функцию HTTP для аутентификации на каждомзапрос, либо простой HTTP или HTTPS.
Это означает, что каждый запрос теперь принимает форму:
https://joe:joepassword@example.com/product/addrating/{id}/{givenRating}/
2) Используйте подход, подобный Amazon S3 с закрытым и открытым ключом: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3) В любом случае используйте cookie-файл и прервите часть REST без состояния.
Второй подход мне кажется лучше, но яоставил вопрос: а нужно ли мне заново изобретать все это?Хеширование, хранение, генерация ключей и т. Д. Самостоятельно?
Это похоже на использование сессии в типичном веб-приложении и переписывание всего стека самостоятельно, что для меня обычно означает «Вы делаете это неправильно», особенно когда речь идет о безопасности.
РЕДАКТИРОВАТЬ: Я думаю, я должен был упомянуть OAuth.