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();