WamISSO Documentation

Laravel Integration

Integrate WamISSO into a Laravel application using HTTP client, sessions, and a dedicated auth controller.

Before you start: Complete developer registration and create an OAuth client in the developer portal. Register a redirect URI such as http://localhost:8001/auth/sso/callback.

Configuration

Add SSO settings to config/services.php:

// config/services.php
'wamisso' => [
    'base_url'      => env('SSO_BASE_URL', 'https://wamisso.rendovations.com'),
    'client_id'     => env('SSO_CLIENT_ID'),
    'client_secret' => env('SSO_CLIENT_SECRET'),
    'redirect'      => env('SSO_REDIRECT_URI'),
],
# .env
SSO_BASE_URL=https://wamisso.rendovations.com
SSO_CLIENT_ID=your-client-id
SSO_CLIENT_SECRET=your-client-secret
SSO_REDIRECT_URI=http://localhost:8001/auth/sso/callback

Routes

// routes/web.php
use App\Http\Controllers\Auth\SsoController;

Route::middleware('guest')->group(function () {
    Route::get('/login', [SsoController::class, 'redirect'])->name('login');
    Route::get('/auth/sso/callback', [SsoController::class, 'callback'])->name('sso.callback');
});

Route::post('/logout', [SsoController::class, 'logout'])
    ->middleware('auth')
    ->name('logout');

Controller

// app/Http/Controllers/Auth/SsoController.php
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;

class SsoController extends Controller
{
    public function redirect(): RedirectResponse
    {
        $state = Str::random(40);
        session(['oauth_state' => $state]);

        $query = http_build_query([
            'client_id'     => config('services.wamisso.client_id'),
            'redirect_uri'  => config('services.wamisso.redirect'),
            'response_type' => 'code',
            'scope'         => 'openid profile email',
            'state'         => $state,
        ]);

        return redirect(config('services.wamisso.base_url').'/oauth/authorize?'.$query);
    }

    public function callback(Request $request): RedirectResponse
    {
        if ($request->query('state') !== session('oauth_state')) {
            abort(403, 'Invalid OAuth state');
        }

        session()->forget('oauth_state');

        $tokens = Http::asForm()
            ->post(config('services.wamisso.base_url').'/oauth/token', [
                'grant_type'    => 'authorization_code',
                'client_id'     => config('services.wamisso.client_id'),
                'client_secret' => config('services.wamisso.client_secret'),
                'redirect_uri'  => config('services.wamisso.redirect'),
                'code'          => $request->query('code'),
            ])
            ->throw()
            ->json();

        $profile = Http::withToken($tokens['access_token'])
            ->get(config('services.wamisso.base_url').'/api/user')
            ->throw()
            ->json();

        $user = User::query()->updateOrCreate(
            ['email' => $profile['email']],
            ['name' => $profile['name'] ?? $profile['email']],
        );

        session([
            'sso_access_token'  => $tokens['access_token'],
            'sso_refresh_token' => $tokens['refresh_token'] ?? null,
        ]);

        Auth::login($user, remember: true);

        return redirect()->intended('/dashboard');
    }

    public function logout(Request $request): RedirectResponse
    {
        $accessToken = session('sso_access_token');

        if ($accessToken) {
            Http::withToken($accessToken)
                ->post(config('services.wamisso.base_url').'/api/sso/logout');
        }

        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();

        return redirect('/');
    }
}

Protect routes

// routes/web.php
Route::middleware('auth')->group(function () {
    Route::get('/dashboard', fn () => view('dashboard'))->name('dashboard');
});

Refresh token

$tokens = Http::asForm()
    ->post(config('services.wamisso.base_url').'/oauth/token', [
        'grant_type'    => 'refresh_token',
        'refresh_token' => session('sso_refresh_token'),
        'client_id'     => config('services.wamisso.client_id'),
        'client_secret' => config('services.wamisso.client_secret'),
    ])
    ->throw()
    ->json();