Останнім часом помічена тенденція, коли деякі бізнес проекти мають кілька різних доменів. І хотілося б, щоб користувач мав єдиний доступ до цих сайтів, не вводячи по 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/
Сортувати записи за категоріями