Единый вход SSO с использованием Laravel Passport

18 января 2024, 20:34

Централизации пользователей для нескольких приложений Laravel можно достичь с помощью подхода единого входа (SSO). Такой подход позволяет пользователям пройти аутентификацию один раз и получить доступ к нескольким приложениям без необходимости повторного входа в систему. Вот шаги по централизации пользователей для нескольких приложений Laravel с помощью SSO:

Шаг 1. Создайте новое приложение Laravel для сервера аутентификации.

Создайте новое приложение Laravel, которое будет служить сервером аутентификации. Это приложение будет обрабатывать логику аутентификации и авторизации пользователя. Вы можете создать новое приложение Laravel, выполнив следующую команду:

composer create-project --prefer-dist laravel/laravel sso-server
cd sso-server

Шаг 2. Установите и настройте пакет Laravel Passport.

Laravel Passport — это пакет, который позволяет создать полную реализацию сервера OAuth2 . Этот пакет будет использоваться для аутентификации и авторизации для различных приложений. Установите Laravel Passport, используя следующую команду:

composer require laravel/passport

После установки пакета необходимо запустить миграцию для создания необходимых таблиц базы данных:

php artisan migrate

Далее вам нужно запустить команду passport:install, чтобы создать ключи шифрования, необходимые для генерации токена безопасного доступа:

php artisan passport:install

Шаг 3. Создайте необходимые конечные точки API для регистрации и входа пользователей.

Создайте необходимые конечные точки API, которые будут обрабатывать регистрацию и вход пользователей. Эти конечные точки будут использоваться различными приложениями для аутентификации пользователей. Вы можете создать эти конечные точки в приложении Laravel, созданном на шаге 1. Для этого смотрите шаг 7.

Шаг 4. Настройте пакет Laravel Passport

Откройте файл sso-server/config/auth.php и добавьте следующие строки в массив Guards:

'api' => [
    'driver' => 'passport',
    'provider' => 'users',
],

Эта конфигурация позволит Laravel Passport обрабатывать аутентификацию для конечных точек API.

Шаг 5. Настройте клиентские приложения для использования сервера аутентификации.

Настройте различные приложения на использование сервера аутентификации для аутентификации пользователей. Вы можете сделать это, добавив клиентский пакет Laravel Passport в каждое приложение:

composer require laravel/passport

Затем добавьте следующую строку в файл config/auth.php:

'api' => [
    'driver' => 'passport',
    'provider' => 'users',
    'hash' => false,
],

Эта конфигурация позволит приложениям использовать сервер аутентификации для аутентификации пользователей.

Шаг 6. Измените промежуточное программное обеспечение аутентификации для клиентских приложений.

Измените промежуточное программное обеспечение аутентификации app/Http/Middleware/RedirectIfAuthenticated.php для клиентских приложений, чтобы проверять, прошел ли пользователь аутентификацию на сервере аутентификации. Вы можете сделать это, добавив следующий код в промежуточное программное обеспечение:

if (!auth()->guard('api')->check()) {
    return redirect()->route('login');
}

Этот код перенаправит пользователя на сервер аутентификации, если он не прошел аутентификацию.

Шаг 7. Внедрите единый вход с использованием аутентификации MySQL.

Чтобы реализовать единый вход с использованием аутентификации MySQL, вам необходимо создать таблицу для хранения информации о пользователе и реализовать логику аутентификации на сервере аутентификации.

Этот код является всего лишь примером того, как использовать аутентификацию с конечной точкой и простой структурой пользователей, но вы можете добавлять пользователей с помощью artisan, других пакетов, ветерка и того, что вы хотите, и, конечно, вы можете добавить более сложную структуру.

  • Создайте таблицу пользователей в базе данных сервера аутентификации:
Schema::create('users', function (Blueprint $table) {create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
  • На сервере аутентификации создайте конечную точку для регистрации нового пользователя:
Route::post('/register', function (Request $request) {
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8',
    ]);

    if ($validator->fails()) {
        return response()->json(['errors' => $validator->errors()], 422);
    }

    $user = \App\Modules\User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => Hash::make($request->password),
    ]);

    return response()->json(['user' => $user], 201);
});
  • Создайте конечную точку для аутентификации пользователя:
Route::post('/login', function (Request $request) {
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        $user = auth()->user();
        $token = $user->createToken('access-token')->accessToken;

        return response()->json(['token' => $token], 200);
    }

    return response()->json(['error' => 'Invalid credentials'], 401);
});
  • Реализуйте логику единого входа:
Route::get('/sso', function (Request $request) {
    $token = $request->query('token');

    // Authenticate the user using the token
    $user = \App\Models\User::where('remember_token', $token)->first();

    if (!$user) {
        return response()->json(['error' => 'Invalid token'], 401);
    }

    // Log in the user and redirect to the client app
    Auth::login($user);
    return redirect($request->query('redirect_uri'));
});

Обновите клиентские приложения для перенаправления на сервер аутентификации для аутентификации:

Route::get('/login', function (Request $request) {
    $redirect_uri = urlencode($request->query('redirect_uri'));

    // Redirect to the authentication server
    return redirect('https://sso-server/sso?redirect_uri=' . $redirect_uri . '&token=' . auth()->user()->remember_token);
})->middleware('auth');

Клиентские приложения теперь будут перенаправлять пользователя на сервер аутентификации для аутентификации. После аутентификации пользователь будет перенаправлен обратно в клиентское приложение с токеном, который можно использовать для аутентификации пользователя в последующих запросах.

Дополнительный шаг 7. Внедрите единый вход с использованием аутентификации Google и Socialite

Реализуйте единый вход, добавив на сервер аутентификации следующий код:

public function redirectToProvider()
{
    return Socialite::driver('google')->redirect();
}

public function handleProviderCallback()
{
    $user = Socialite::driver('google')->user();

    // Logic to authenticate the user

    return redirect('/home');
}

Этот код перенаправит пользователя на страницу аутентификации Google для его аутентификации. После аутентификации пользователь будет перенаправлен обратно на сервер аутентификации, где его личность будет проверена. Затем пользователь будет перенаправлен в клиентское приложение.

Шаг 8. Тестирование реализации единого входа

Протестируйте реализацию единого входа, войдя в одно из клиентских приложений. После входа попробуйте получить доступ к другому клиентскому приложению. Вы должны пройти автоматическую аутентификацию без необходимости повторного входа в систему.

Таким образом, централизация пользователей для нескольких приложений Laravel может быть достигнута путем создания центрального сервера аутентификации и необходимых конечных точек, чтобы пользователи могли регистрироваться и входить в систему с едиными учетными данными и даже использовать социальные приложения, такие как Facebook, Google и т. д.

MODX.ONE
1    587    0
0

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.