Додавання Enterprise SSO / SAML до Laravel

pic

Laravel — це фреймворк для веб-застосунків на основі PHP. Якщо ви ознайомитесь з їхнім маркетинговим сайтом, ви побачите кілька загальних слів, таких як елегантний, простий та чистий.

І це тому, що вони сильно зосереджуються на чудовому досвіді розробника (DX), надаючи багато стандартних функціональностей, таких як валідація, зберігання об'єктів, підтримка міграцій баз даних, черги, обмеження швидкості та багато іншого. Їхні утиліти для тестування — це одне з моїх улюблених речей.

У цьому пості ми розглянемо, як розширити підтримку автентифікації та авторизації, щоб включити Enterprise SSO / SAML.

Налаштування Enterprise SSO дозволить вашим користувачам увійти в ваш продукт, використовуючи їхні існуючі робочі акаунти, такі як Okta, Entra (раніше Azure AD), ADFS, OneLogin, JumpCloud, Duo і багато інших. Але спершу давайте розглянемо, що таке Enterprise SSO і чому вам це може бути потрібно.

Що таке Enterprise SSO?

SSO означає Single Sign On і позначає ситуацію, коли користувач використовує один акаунт для доступу до кількох застосунків.

Ймовірно, ви знайомі з цим, взаємодіючи з кнопками “Увійти через Google” на кшталт таких:

pic

Ви можете використовувати свій єдиний акаунт Google для входу в будь-який застосунок, який додав функціональність "Увійти через Google".

Важливо, що це не є Enterprise SSO. Це форма SSO, зазвичай відома як Соціальний вхід, оскільки часто пов'язана з входом до акаунта в соціальній мережі (LinkedIn, Twitter, Facebook тощо).

Enterprise SSO, з іншого боку, призначений для ситуацій, коли користувач входить у ваш продукт через акаунт, наданий його роботодавцем (наприклад, [email protected], але не [email protected]). Це часто трапляється в B2B-застосунках, де ваші клієнти — це не просто індивідуальні користувачі, а команди чи компанії.

Типовий робочий процес полягає в тому, що ви вводите свою електронну адресу, а потім вас перенаправляють на сторінку входу, призначену лише для вашої компанії:

pic

Ми маємо детальніше пояснення тут, яке також охоплює функції на зразок SCIM, але ще одна важлива відмінність полягає в тому, що на відміну від соціальних входів, які налаштовуються один раз для всіх клієнтів, підключення Enterprise SSO потрібно налаштовувати для кожного клієнта окремо.

Чи потрібен вам Enterprise SSO?

Enterprise SSO часто додається за потребою клієнтів. Це може бути вимогою для роботи з великими клієнтами, але не всі з них будуть використовувати однакову термінологію. Вони можуть сказати таке:

  • “Чи можу я увійти в ваш продукт через мій акаунт Okta?”
  • “Чи можу я підключити ADFS до вас?”
  • “Нам також потрібна підтримка SSO”
  • “Ви підтримуєте SAML / SCIM?”

Якщо ви отримуєте такі запити, відповідь майже напевно так.

Якщо ні — ймовірно, вам це ще не потрібно.

Додавання Enterprise SSO до Laravel

Ми будемо використовувати PropelAuth Socialite Provider для підключення автентифікації Laravel до PropelAuth. PropelAuth потім буде обробляти налаштування/вступ для ваших корпоративних клієнтів, а також їхній вхід.

В результаті нам потрібно буде додати лише два кінцевих пункти.
Першим є кінцевий пункт для перенаправлення, який перенаправить користувача на сторінку входу, призначену лише для їхньої організації:

Route::get('/auth/redirect', function (\Illuminate\Http\Request $request) {  
 $email = $request->query('email');  
 $queryParams = ['email' => $email];  
 return Socialite::driver('propelauth')->with($queryParams)->redirect();  
});

Другим є кінцевий пункт для налаштування користувача та входу в систему:

Route::get('/auth/callback', function (Request $request) {  
 $propelauthUser = Socialite::driver('propelauth')->user();  
 $user = UserHelper::upsert($propelauthUser);  
 Auth::login($user);  
 return redirect('/');  
});

Але перш ніж ми зможемо це зробити, нам потрібно налаштувати PropelAuth для Enterprise SSO.

Налаштування PropelAuth для Enterprise SSO

PropelAuth — це провайдер автентифікації, розроблений для B2B-застосунків. Оскільки ми будемо продовжувати використовувати Laravel для Authn/Authz та використовувати PropelAuth лише для Enterprise SSO — перший крок полягає в тому, щоб вимкнути всі методи входу, окрім Enterprise SSO.

Це можна зробити в панелі керування під Signup / Login:

pic

Далі нам потрібна організація, в яку користувачі можуть увійти. Ви можете створити одну, перейшовши до Organizations в боковій панелі та створивши її через панель керування:

pic

Після створення організації ви можете налаштувати Enterprise SSO для неї, перейшовши на вкладку налаштувань для цієї організації та активувавши “Can this organization setup SAML?”

pic

І врешті-решт, ми можемо згенерувати посилання для налаштування SAML, яке наші клієнти можуть використовувати для налаштування Enterprise SSO. Налаштування Enterprise SSO часто має довгий процес зворотних запитів (вам потрібно зібрати від них такі поля, як їхній видавець і сертифікат, а їм потрібно зібрати від вас такі поля, як ACS URL, потрібно відобразити правильні атрибути, тощо).

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

Підключення Laravel і PropelAuth

У нас вже налаштовано Enterprise SSO! Наші користувачі можуть налаштовувати підключення, тестувати ці підключення і навіть входити за допомогою своїх робочих акаунтів. Є тільки одна проблема… нам потрібно повідомити Laravel, коли вони входять.

Тут і з'являється PropelAuth Socialite Provider. Давайте почнемо з його встановлення:

composer require socialiteproviders/propelauth

Тепер додамо наступні значення до нашого файлу .env для провайдера:

# Ви можете знайти ці значення в панелі керування PropelAuth під  
# Frontend Integration => Advanced Settings => Edit OAuth Config  
PROPELAUTH_CLIENT_ID=0166...  
PROPELAUTH_CLIENT_SECRET=f92ac31...  
# Це може бути будь-яке URL, переконайтесь, що зберегли його в нашій OAuth конфігурації   
PROPELAUTH_CALLBACK_URL=http://localhost:8000/auth/callback  
# Ви можете знайти це в панелі керування PropelAuth під Frontend Integration  
PROPELAUTH_AUTH_URL=https://auth.example.com

Далі, перейдіть до config/services.php і додайте провайдера PropelAuth.

'propelauth' => [  
 'client_id' => env('PROPELAUTH_CLIENT_ID'),  
 'client_secret' => env('PROPELAUTH_CLIENT_SECRET'),  
 'redirect' => env('PROPELAUTH_CALLBACK_URL'),  
 'auth_url' => env('PROPELAUTH_AUTH_URL'),  
],

Тепер нам потрібно зареєструвати прослуховувач подій (Event Listener), щоб розширити Socialite з провайдером PropelAuth.
Це дозволить нам автентифікувати користувачів через PropelAuth.

// /app/Providers/AppServiceProvider.php  
namespace App\Providers;  

use Illuminate\Support\ServiceProvider;  
use Illuminate\Support\Facades\Event;  

class AppServiceProvider extends ServiceProvider  
{  
 public function register(): void  
 {  
 }  

 public function boot(): void  
 {  
 // НОВИЙ КОД ТУТ  
 Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) {  
 $event->extendSocialite('propelauth', \SocialiteProviders\PropelAuth\Provider::class);  
 });  
 }  
}

Останнім кроком ми готові повернути ті два маршрути, які ми розглядали раніше:

Route::get('/auth/redirect', function (\Illuminate\Http\Request $request) {  
 $email = $request->query('email');  
 $queryParams = ['email' => $email];  
 return Socialite::driver('propelauth')->with($queryParams)->redirect();  
});  

Route::get('/auth/callback', function (Request $request) {  
 $propelauthUser = Socialite::driver('propelauth')->user();  
 $rawUser = $propelauthUser->getRaw();  
 $user = User::updateOrCreate([  
 // Ви також можете зробити цей пошук за ID в залежності від вашої схеми  
 'email' => $propelauthUser->email,  
 ], [  
 'name' => trim($propelauthUser->first_name . ' ' . $propelauthUser->last_name),  
 'email' => $propelauthUser->email,  

 // Інформація про організацію користувача. Це включатиме організацію, через яку вони увійшли  
 // через SAML, а також їхню роль в організації.  
 'orgMemberInfo' => $rawUser['org_member_info'] // інформація про організацію користувача  
 ]);  
 Auth::login($user);  
 return redirect('/');  
});

І тепер ми готові до тестування! Якщо ви перейдете за посиланням http://localhost:8000/auth/[email protected] (якщо ви налаштували Enterprise SSO для організації domain.com), вам буде запропоновано увійти за допомогою вашого робочого акаунта. Після входу в систему буде створено новий акаунт у Laravel, який включатиме організацію, через яку ви щойно увійшли.

Оновлення інтерфейсу входу

Наші користувачі, ймовірно, не наткнуться на шлях /auth/redirect випадково, тому нам потрібно оновити інтерфейс входу.

Як ви це зробите, залежить від застосунку. Деякі застосунки мають окрему сторінку входу для корпоративних клієнтів. Деякі застосунки запитують електронну адресу та переходять до входу через пароль, якщо немає підключення до Enterprise SSO для цього користувача.

Яким би способом ви не вибрали, єдине, що вам потрібно зробити, це перенаправити користувача на /auth/redirect, і після того, як вони увійдуть, вони повернуться на /auth/callback.

Підсумок

Enterprise SSO може бути складним завданням — кожен провайдер відрізняється, і кожен клієнт повинен бути інтегрований окремо.

У цьому пості ми розглянули, як можна підключити Laravel до PropelAuth, щоб спростити процес до таких кроків:

  • Надіслати клієнту посилання, яке проведе його через процес інтеграції
  • Працівники цього клієнта зможуть увійти в наш застосунок за допомогою своїх робочих акаунтів

Оскільки ми також створюємо користувача в Laravel, це все природно працює з вбудованими функціями автентифікації/авторизації, такими як gates і тайм-аути сесій/їхнє скасування.

Якщо у вас є питання, не соромтесь звертатися на [email protected].

Перекладено з: Adding Enterprise SSO / SAML to Laravel

Leave a Reply

Your email address will not be published. Required fields are marked *