При разработке REST API обычно используется аутентификация пользователя в первую очередь?
Типичный пример использования, который я ищу, это:
- Пользователь хочет получить данные. Конечно здорово, что мы хотели бы поделиться! Получить общедоступный ключ API и прочесть!
- Пользователь хочет хранить/обновлять данные... woah wait up! кто вы, можете ли вы это сделать?
Я хотел бы создать его один раз и разрешить использовать веб-приложение, приложение для Android и приложение для iPhone.
API REST представляется логичным выбором с такими требованиями, как
Чтобы проиллюстрировать мой вопрос, я буду использовать простой пример.
У меня есть элемент в базе данных, который имеет атрибут рейтинг (целое число от 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} рейтинг {givenRating}.
Вопрос: Как узнать, что запрос пришел из "JOE" , а не "BOB".
Кроме того, что, если это было для более разумных данных, таких как номер телефона пользователя?
То, что у меня есть до сих пор:
1) Используйте встроенную функцию HTTP для аутентификации при каждом запросе, либо в обычном HTTP, либо в HTTPS.
Это означает, что каждый запрос теперь принимает форму:
https://joe:[email protected]/product/addrating/{id}/{givenRating}/
2) Используйте такой подход, как Amazon S3 с закрытым и открытым ключом: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3) В любом случае используйте файл cookie и разбивайте аганированную часть REST.
Второй подход кажется мне лучше, но мне остается интересно, действительно ли мне нужно изобретать все это? Хеширование, хранение, создание ключей и т.д. Все отдельно?
Это очень похоже на использование сеанса в типичном веб-приложении и переписывание всего стека самостоятельно, что обычно для меня означает "вы делаете это неправильно", особенно при работе с безопасностью.
EDIT: Думаю, я должен был упомянуть OAuth.