Реалізація single sign on в symfony2 додатку
Що таке Single Sign On?
Single Sign On - це технологія, за допомогою якої користувач, будучи аутентифицироваться на засвідчувальному центрі (далі Identity Provider, IdP). буде автоматично аутентифікований на іншому сервісі (далі Service Provider, SP або Consumer [1-N]) цієї компанії.
Механізм Single Sign On використовують такі сайти, як ХабраХабр. Yandex. Google. Переваги такого підходу до аутентифікації користувачів очевидні:
- Втрата пароля від IdP тягне за собою проблему входу в усі сервіси
- Потенційно збільшений ризик крадіжки майстер сесії з IdP (може бути зменшений за допомогою прив'язки сесії до підмережі провайдера, а також використання HTTPS. HTTP Only Cookies та SSL Only Cookies)
- Потенційно збільшений ризик крадіжки пароля від IdP
- .
Незважаючи на це, з точки зору бізнесу, а також user experience, реалізація даного функціоналу переважує всі мінуси, і починається епопея з імплементації SSO в компанії.
Перед тим як приступити до імплементації SSO в компанії, добре було б переконатися, що ви добре знаєте, що таке:
Отже, після ознайомлення з базовою теорією: що таке SSO, аспектами безпеки, які пов'язані з цим завданням, - ми можемо приступити до її реалізації.
Як це буде працювати
У загальному випадку аутентифікація буде проходити за наступним сценарієм:

У разі, коли IdP відповів, що такий OTP існує і валиден, SP аутентифікує користувача за допомогою видачі йому PreAuthenticatedToken'а.
Вихід буде працювати за такою схемою:

Зверніть увагу, що даний тип виходу розглядається з точки зору початку процесу на SP. Це важливо, тому що користувач буде повернутий туди, де він почав робити цю операцію.
Припустимо, що користувач був на якійсь сторінці / secured_area і натиснув на «Вихід». У цей момент відбувається локальний логаут в рамках SP. Потім ми йдемо на IdP на спеціальний URL / sso / logout. який буде керувати процесом виходу з усіх сервісів для цього користувача. Оскільки користувач вже прийшов з SP, то IdP вибирає наступний сервіс, який є в компанії, і відправляє на нього робити вихід. Той сервіс, в свою чергу, знову по завершенню, відправляє нас на IdP і в разі, якщо послуги скінчилися, виконує локальний вихід (п. 5 на схемі). Після користувач відправляється назад на SP, з якого він почав робити вихід.
Є й інший варіант розвитку подій, в якому користувач починає процес виходу не з SP а з IdP. І виглядає це приблизно так:

Засвідчує центр (IdentityProvider)
Щоб зробити засвідчує центр, спочатку ви повинні вибрати програму у вашій компанії, яке буде за це відповідати, на зразок, як це зроблено у Yandex (Яндекс.Паспорт) або у Google (Google Accounts).
В цей додаток ми будемо устанавліваеться першу частину: SingleSignOnIdentityProviderBundle
SingleSignOnIdentityProviderBundle відповідає за:
- Генерацію одноразових паролів (OTP)
- Запам'ятовує в сесію, з якого SP прийшов користувач
- Функціональність для виходу з усіх SP-ів
Ставимо через composer:
Далі оновлюємо залежності і прописуємо наш бандл в AppKernel:
Підключаємо Рауса / sso / login і / sso / logout з бандла: