Безопасный доступ к аутентифицированному серверу REST через Backbone.js?

У меня был этот REST-сервер (написанный мной), который защищен простой HTTP-аутентификацией.

Теперь я переписал приложение с помощью backbone.js, и я не уверен, как пройти проверку подлинности моего клиента. Если я сделаю это в JS user/pass, будет видно.

Итак, как мне изменить свой сервер или JS на стороне клиента для обеспечения безопасности?

Раньше я просто дал пользователю и передал PHP для каждого запроса на REST Server, пожалуйста, направляйте меня, спасибо.

Ответы

Ответ 1

Хорошо, я поговорил с моим коллегой и придумал лучшую идею:

Сделайте простой контроллер на своей стороне клиента (сайте) и назовите его как RESTAPI, он просто будет действовать как обертка на ваш реальный сервер REST.

Когда пользователь входит в ваш сайт, его сеанс создается. Контроллер RESTAPI знает учетные данные для вашего реального сервера REST HTTP Authed, и он обращается к серверу REST от имени магистра.

Пример: если мне нужно выбрать

/сообщения/отправляемые

от REST Server, теперь вместо этого я удалю этот URL-адрес в базовой сети

сайт/restapi/сообщения/отправляемые

Контроллер RESTAPI также сначала проверяет, что запрашивающий пользователь имеет правильную сессию на сайте, и погода, на которую он может получить ресурс, или нет.

Так что не беспокойтесь о небезопасных куках или оставите свой сервер REST в простой JS или используя любой другой неясный метод:)

Ответ 2

HTTP. Обычная проверка подлинности подвержена подслушиванию и атакам "человек-в-середине". Рекомендуется использовать HTTPS.

Однако, если это не опция, вы всегда можете отправить cookie обратно клиенту и ввести имя пользователя/пароль, чтобы он не отображался в JS файле. Идет, не говоря, что пароль должен по крайней мере быть зашифрован/хэширован по соображениям безопасности. Затем брандмауэр будет на стороне сервера, чтобы получить данные аутентификации из файла cookie.

Теперь, если у вас нет контроля над модификацией кода на стороне сервера, вы почти не имеете никакого другого параметра, кроме того, что захотите детали учетных данных в глобальном методе ajaxSend(), который будет отправлять данные имени пользователя/пароля с помощью каждый запрос AJAX. Вы можете просто поместить это в какой-нибудь другой .js файл и затруднить его поиск, но вы в значительной степени ограничены этой формой безопасности. Хотя, куки не делают вашу жизнь более безопасной. (Было бы хорошо, если пароль хэширован/зашифрован).

Другая вещь, которую вы могли бы сделать, - это немного более сложная форма безопасности: пусть сервер отправит nonce обратно с каждым ответом - nonce будет "подписан" сервером, используя секретный ключ сервера, и вы можете использовать чтобы "зашифровать" имя пользователя/пароль на стороне клиента для каждого запроса. Затем ваш сервер должен будет постоянно расшифровывать учетные данные. Это менее склонно к человеку в середине, но все же не является надежным.

HTTPS сохранит вас от каждого из вышеперечисленных, если это вариант для вас.

Надеюсь, что это поможет.

ОБНОВЛЕНИЕ (согласно комментариям): Суть спокойствия - отсутствие состояния на сервере. I.e., нет сеансов! Следовательно, вам нужно отправить учетные данные пользователя с помощью КАЖДОГО запроса, который клиент делает на сервере. Если у вас есть страница входа в систему, очень трудно по-настоящему успокоиться, так как нет "ресурса", называемого login. Однако вот что вы можете сделать:

  • Пользователь посещает страницу входа, вводит учетные данные и клики "login"
  • Отправьте запрос POST на сервер с этими учетными данными - возможно, чтобы /Login
  • Попросите сервер вернуть запрошенный ресурс, для которого требуется проверка подлинности, и установите cookie с действительными учетными данными для использования в следующем запросе
  • Каждый последующий запрос будет направлен на соответствующий ресурс по определенному URL-адресу с определенным действием (GET, PUT, POST, DELETE...). Сервер должен проверить данные проверки подлинности из файла cookie и решить, будет ли пользователь аутентифицирован и выполнить дальнейшую авторизацию для предоставления доступа, если это необходимо.

Каждый запрос должен идентифицировать себя, не поддерживая сервер сессию - что дух безгражданства (и спокойствия)

Ответ 3

Если у вас есть доступ к вашему REST-коду на сервере, вы можете переконфигурировать аутентификацию REST. В первый раз для входа в систему вы отправляете имя пользователя/пароль через https, в свою очередь получаете идентификатор сеанса, который может использоваться в последующих запросах, передавая его как cookie.