Аутентификация REST API на основе браузера

Я работаю над веб-службой REST и, в частности, над методами аутентификации для запросов на основе браузера. (с использованием JsonP или междоменных запросов XHR/XDomainRequest).

Я провел некоторое исследование в OAuth, а также в AWS от Amazon. Большие недостатки обоих заключаются в том, что мне нужно сделать одно из следующих действий:

  • Хранить секретные токены в браузере
  • Пусть серверный скрипт обрабатывает подпись. По сути, я бы сначала отправил запрос на мой сервер, чтобы получить определенный предварительно подписанный запрос javascript, который я буду использовать для подключения к реальному серверу REST.

Какие еще есть варианты или предложения?


person Evert    schedule 21.10.2010    source источник


Ответы (3)


Ну, единственный верный ответ здесь — это проксирование через сервер, использование сеансов/куки для аутентификации и, конечно же, использование SSL. Извините за ответ на мой собственный вопрос.

person Evert    schedule 27.10.2010

Да, аутентификация вызова jsonp сложна, потому что браузер-клиент должен знать общий секрет.

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

Я когда-то экспериментировал с одноразовыми токенами, но все они несколько потерпели неудачу, потому что у вас есть проблема с получением самого токена и защитой многократного извлечения токена ботами (что снова приводит к необходимости ограничения скорости).

person manuel aldana    schedule 21.10.2010
comment
извините... поздний вечер, когда я печатал / писал по орфографии, сегодня утром употребили бы термин "уязвимость" ;) - person manuel aldana; 21.10.2010
comment
Я подумываю о том, чтобы использовать токен с несколькими запросами с ограниченным временем.. :S - person Evert; 21.10.2010
comment
когда вы закончите, было бы здорово узнать вашу реализацию - person manuel aldana; 24.10.2010

Я не пробовал это сам, но вы можете попробовать следующее .. (я почти уверен, что получу отзыв)

На стороне сервера сгенерируйте временную метку. Используя HMAC-SHA256, сгенерируйте ключ для этой метки времени, используя пароль, и отправьте сгенерированный ключ и метку времени в HTML.

Когда вы делаете вызов AJAX к веб-службе (при условии, что это другой сервер), отправьте ключ и отметку времени вместе с запросом. Проверьте, находится ли отметка времени в пределах 5-15 минут. Если это так, выполните HMAC-SHA256 с тем же паролем и ключом, если сгенерированный ключ тот же. Также на стороне клиента вам нужно будет проверить, действительна ли ваша временная метка, прежде чем совершать вызов.

Вы можете сгенерировать ключ, используя следующий URL-адрес. /а>

person ps.    schedule 27.10.2010