// codeart.ru / Теория программирования / Про backbone, Cookie и CORS (кроссдоменные запросы) Форум

Про backbone, Cookie и CORS (кроссдоменные запросы) rss подписка

Автор: Oleg Eremeev

Так как наши сервисы направлены на создание виджетов для разных сайтов, то нам нужно обеспечить кроссдоменное взаимодействие между сайтом, где будет стоять  виджет, и backend-ом, где расположены наши сервисы. К счастью, сегодня организовать кроссдоменное взаимодействие напорядок проще чем каких-нибудь несколько лет назад. Но и тут есть свои нюансы. Например, передача  Cookies.

v.0.1 Заголовки nginx для CORS

У нас есть сервис, к которому нужно получить доступ из другого домена. При этом сервис должен обеспечить возможность предоставлять разным пользователям свой контент. Т.е. фактически нам нужно сначало делать авторизацию пользователя в сервисе, а затем предоставлять ему нужную информацию. Так вот, без Cookies  сделать подобное поведение не очень удобно. Поэтому мы захотели их использовать в кроссдоменных запросах.

Но здесь есть одна проблема, чтобы современный бразуер обрабатывал кроссдоменные запросы, ему нужно выдать определенные заголовки. Чтобы не выносить эти заголовки на уровень приложения мы сделали их в конфиге веб-сервера. Для  nginx это выглядит следующим образом:


add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Credentials 'true';
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT';
add_header Access-Control-Allow-Headers '*';

Эти заголовки замечательно работают, но до тех пор пока вы не захотите использовать Cookie.

v.0.2 Включаем Cookies в CORS

Мы используем в своей работе Backbone, который в свою очередь использует jQuery. По-умолчанию, запросы jQuery идут к сервер без Cookies. Для того чтобы их включить мы используем функцию ajaxPrefilter и параметр withCredentials (пример ниже на CofeeScript):


Profile = Backbone.Model.extend {
urlRoot: "http://eservices.sandbox.defaceit.ru/profile/json"
initialize: ->
$.ajaxPrefilter (options, originalOptions, jqXHR) ->.
options.xhrFields = {withCredentials: true}
}

Но после включения параметра withCredentials браузер ругается на заголовок Access-Control-Allow-Origin ‘*’. Оказывается, что политика безопасности в таком случае запрещает использовать wildcard для Origin-a. Поэтому нам пришлось исключить данный заголовок из параметров Nginx, а вместо этого задавать его явно при обработке запроса со стороны backend-а.

v.1.0 Заключение

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

Leave a Reply

« »