Client App Setup

Contoh integrasi SSO di aplikasi Laravel client:

1. Install Socialite

composer require laravel/socialite

2. Konfigurasi Provider

Tambahkan di config/services.php:

'sso' => [
    'client_id' => env('SSO_CLIENT_ID'),
    'client_secret' => env('SSO_CLIENT_SECRET'),
    'redirect' => env('SSO_REDIRECT_URI'),
    'host' => env('SSO_HOST', 'http://localhost:8555'),
],

3. Environment Client

SSO_HOST=http://localhost:8555
SSO_CLIENT_ID=your-client-id
SSO_CLIENT_SECRET=your-client-secret
SSO_REDIRECT_URI=http://your-app.test/auth/callback

4. Routes

// routes/web.php
Route::get('/auth/redirect', function () {
    return Socialite::driver('sso')->redirect();
});

Route::get('/auth/callback', function () {
    $ssoUser = Socialite::driver('sso')->user();
    
    $user = User::updateOrCreate(
        ['email' => $ssoUser->email],
        ['name' => $ssoUser->name]
    );
    
    Auth::login($user);
    return redirect('/dashboard');
});

5. Custom SSO Provider

Buat provider di app/Providers/SsoServiceProvider.php:

use Laravel\Socialite\Two\AbstractProvider;

class SsoProvider extends AbstractProvider
{
    protected function getAuthUrl($state)
    {
        return $this->buildAuthUrlFromBase(
            config('services.sso.host') . '/oauth/authorize',
            $state
        );
    }

    protected function getTokenUrl()
    {
        return config('services.sso.host') . '/oauth/token';
    }

    protected function getUserByToken($token)
    {
        $response = $this->getHttpClient()->get(
            config('services.sso.host') . '/api/user',
            ['headers' => ['Authorization' => 'Bearer ' . $token]]
        );
        return json_decode($response->getBody(), true);
    }

    protected function mapUserToObject(array $user)
    {
        return (new User)->setRaw($user)->map([
            'id' => $user['id'],
            'name' => $user['name'],
            'email' => $user['email'],
        ]);
    }
}