Кросдоменна авторизація - як реалізувати

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

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

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