Кросдоменная авторизация: как реализовать?

В последнее время замечена тенденция, когда некоторые бизнес проекты имеют несколько разных доменов. И хотелось бы, чтобы пользователь имел единый доступ к этим сайтам, не вводя по 10 раз один и тот же логин и пароль на каждом из сайтов.

И тут появляется проблема с тем, что в целях безопасности мы не можем просто так взять и автоматически авторизировать пользователя с одного домена на другом.

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

Но все же, до того как вы перейдете на хабр, я хочу коротко описать как решить эту проблему.

Теория:

Итак, как я уже и сказал, в целях безопасности авторизироваться на другом домене нельзя из-за заголовков:
Access-Control-Allow-Origin — данный заголовок определяет, с каких ресурсов могут приходить запросы. Может использоваться *или конкретный домен, например http://foo.example. Данный заголовок может быть только один, и может содержать только одно значение, т.е. список доменов задать нельзя.

Access-Control-Allow-Methods — этот заголовок определяет, какие методы могут использоваться для общения с сервером. Ограничимся следующими: POST,GET,OPTIONS, но так же можно использовать и PUT, и DELETE, и другие.

Access-Control-Allow-Headers — этот заголовок определяет список доступных заголовков. Например Content-Type, который позволит задать тип ответа application/json.

Access-Control-Allow-Credentials — этот заголовок определяет, разрешается ли передавать Cookie и Authorization заголовки. Возможные значения true и false. Важно: данные будут передаваться, только если в заголовке Access-Control-Allow-Origin будет явно выставлен конкретный домен, если использовать * — заголовок будет проигнорирован и данные передаваться не будут.

Для поддержки отправки авторизационных и Cookie данных, необходимо, чтобы в XmlHttpRequest был выставлен в true флаг withCredentials.

Так же есть в ajax флаг crossDomain который тоже надо выставить в true.

Решение:

Итак, что я сделал.

На втором домене где мне нужно было авторизировать пользователя я в php добавил заголовок header('Access-Control-Allow-Origin: *');

А с первого домена посылал ajax запрос
$.ajax({
type: "POST",
async:true,
cache: false,
xhrFields: {
withCredentials: true
},
url: 'http://otherdomain.com',
crossDomain:true,
data: {username:login,password:pass,login:"Submit"}
});

Таким образом, если теперь открыть второй домен (для примера взят http://otherdomain.com), то пользователь первого домена будет там авторизирован.

Ну и в заключение, как и обещал, статья на хабре для тех кому интересно почитать в развернутом виде об этой проблеме http://habrahabr.ru/post/219895/

Автор: Дмитрий Кловак

24 Июня 2014

Категория: Программирование

Сортировать записи по категориям