Реалізація 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, аспектами безпеки, які пов'язані з цим завданням, - ми можемо приступити до її реалізації.

Як це буде працювати


У загальному випадку аутентифікація буде проходити за наступним сценарієм:

Реалізація single sign on в symfony2 додатку

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

Вихід буде працювати за такою схемою:

Реалізація single sign on в symfony2 додатку

Зверніть увагу, що даний тип виходу розглядається з точки зору початку процесу на SP. Це важливо, тому що користувач буде повернутий туди, де він почав робити цю операцію.

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

Є й інший варіант розвитку подій, в якому користувач починає процес виходу не з SP а з IdP. І виглядає це приблизно так:

Реалізація single sign on в symfony2 додатку

Засвідчує центр (IdentityProvider)


Щоб зробити засвідчує центр, спочатку ви повинні вибрати програму у вашій компанії, яке буде за це відповідати, на зразок, як це зроблено у Yandex (Яндекс.Паспорт) або у Google (Google Accounts).

В цей додаток ми будемо устанавліваеться першу частину: SingleSignOnIdentityProviderBundle

SingleSignOnIdentityProviderBundle відповідає за:

  • Генерацію одноразових паролів (OTP)
  • Запам'ятовує в сесію, з якого SP прийшов користувач
  • Функціональність для виходу з усіх SP-ів

Ставимо через composer:


Далі оновлюємо залежності і прописуємо наш бандл в AppKernel:


Підключаємо Рауса / sso / login і / sso / logout з бандла: