+44 (0) 208 123 1778 +1 (347) 983 0157 +38 (0) 44 221 9595
 
 
 

НАПИШИТЕ НАМ

Опишите кратко ваш проект
и мы рассчитаем стоимость.

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

Кросдоменная авторизация/Cross Domain Autorization

Дмитрий Кловак
Дмитрий Кловак
В последнее время замечена тенденция, когда некоторые бизнес проекты имеют несколько разных доменов. И хотелось бы, чтобы пользователь имел единый доступ к этим сайтам, не вводя по 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/

Профиль в Google+




News
04.07.2016
Открыта вакансия ПХП разработчика
Приглашаем Middle PHP developer.

30.12.2015
С Новым годом и Рождеством !
Наилучшие пожелания в 2016 году от компании "Болд Ендеворс"!

29.12.2015
"Болд Ендеворс" пригласили для участия в тендере.
Нашу компанию пригласили для участия в тендере на разработку сайта ПАТ "Idea Bank"