Авторизация REST-запросов - PullRequest
       26

Авторизация REST-запросов

15 голосов
/ 27 октября 2008

Я работаю над REST-сервисом, который имеет несколько требований:

  1. Должно быть безопасно.
  2. Пользователи не должны иметь возможность подделывать запросы.

Мое текущее предлагаемое решение состоит в том, чтобы иметь настраиваемый заголовок авторизации, который выглядит следующим образом (так же, как работают веб-сервисы amazon):

Authorization: MYAPI username:signature

У меня вопрос, как сформировать подпись. Когда пользователь входит в службу, ему выдается секретный ключ, который он должен использовать для подписи запросов. Это остановит других пользователей, отправляющих запросы от своего имени, но не остановит подделку запросов.

Приложение, которое будет использовать этот сервис, является приложением для iPhone, поэтому я подумал, что в приложение может быть встроен открытый ключ, с которым мы можем сделать дополнительную подпись, но означает ли это, что у нас будет два подписи, одна для ключа пользователя и одна для ключа приложения?

Буду очень признателен за любой совет, я бы очень хотел сделать это правильно с первого раза.

Ответы [ 4 ]

8 голосов
/ 01 мая 2009

Ответ прост: это невозможно сделать. Как только вы отправляете какое-либо решение конечному пользователю, он или она всегда может атаковать сервер, с которым он связывается. Наиболее распространенная версия этой проблемы - мошенничество со списками рекордов во флеш-играх. Вы можете сделать это сложнее , внедрив в клиент своего рода шифрование и запутав код ... Но весь скомпилированный и запутанный код всегда можно декомпилировать и не подвергать сомнению. Это просто вопрос того, сколько времени и денег вы готовы потратить, а также потенциального злоумышленника.

Таким образом, вы должны , а не , как попытаться предотвратить отправку пользователем неверных данных в вашу систему. Это способ предотвратить повреждение вашей системы пользователем . Вы должны спроектировать свои интерфейсы так, чтобы весь ущерб, нанесенный неверными данными, влиял только на отправляющего пользователя.

2 голосов
/ 27 октября 2008
1 голос
/ 31 октября 2008
1 голос
/ 27 октября 2008

Я думаю, что самый простой способ сделать это правильно - использовать аутентификацию клиента HTTPS. На сайте Apple есть тема на эту тему.

Изменить: для обработки авторизации я бы создал отдельный ресурс (URI) на сервере для каждого пользователя и разрешил бы только этому (аутентифицированному) пользователю манипулировать этим ресурсом.

Edit (2014): Apple изменила свое программное обеспечение для форумов за последние шесть лет; поток сейчас на https://discussions.apple.com/thread/1643618

...