Laravel Socialite: accesso OpenID Connect con PKCE
Accesso con Dazr Identity: OpenID Connect gratuito, ospitato nell’UE, con passkey, codici via email e account Google o Microsoft dietro un solo pulsante.
Le servono tre valori dalla console per sviluppatori: il client ID, il client secret (solo per le app web server) e l’URI di reindirizzamento registrato. Tutto il resto è nel documento di discovery all’indirizzo https://identity.dazr.eu/.well-known/openid-configuration.
Laravel
Laravel Socialite non ha un driver OpenID Connect generico integrato, quindi aggiunga un piccolo driver personalizzato. Manda le persone a Dazr con PKCE e legge l’utente dall’endpoint userinfo. Socialite non legge il documento di discovery, per questo gli endpoint sono scritti per esteso. Registri un’app web server con l’URI di reindirizzamento https://app.example.eu/auth/dazr/callback.
<?php
// app/Socialite/DazrProvider.php
namespace App\Socialite;
use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\User;
class DazrProvider extends AbstractProvider
{
protected $scopes = ['openid', 'profile', 'email'];
protected $scopeSeparator = ' ';
protected $usesPKCE = true;
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase('https://identity.dazr.eu/oauth/authorize', $state);
}
protected function getTokenUrl()
{
return 'https://identity.dazr.eu/oauth/token';
}
protected function getUserByToken($token)
{
$response = $this->getHttpClient()->get('https://identity.dazr.eu/oauth/userinfo', [
'headers' => ['Authorization' => 'Bearer '.$token],
]);
return json_decode((string) $response->getBody(), true);
}
protected function mapUserToObject(array $user)
{
return (new User)->setRaw($user)->map([
'id' => $user['sub'],
'name' => $user['name'] ?? null,
'email' => $user['email'] ?? null,
]);
}
}
// config/services.php
'dazr' => [
'client_id' => env('DAZR_CLIENT_ID'),
'client_secret' => env('DAZR_CLIENT_SECRET'),
'redirect' => env('DAZR_REDIRECT_URI'),
],
// app/Providers/AppServiceProvider.php, in boot()
use Laravel\Socialite\Facades\Socialite;
use App\Socialite\DazrProvider;
Socialite::extend('dazr', function ($app) {
return Socialite::buildProvider(DazrProvider::class, config('services.dazr'));
});
// routes/web.php
Route::get('/auth/dazr', fn () => Socialite::driver('dazr')->redirect());
Route::get('/auth/dazr/callback', function () {
$dazr = Socialite::driver('dazr')->user();
$user = \App\Models\User::updateOrCreate(
['dazr_sub' => $dazr->getId()],
['name' => $dazr->getName() ?? $dazr->getEmail(), 'email' => $dazr->getEmail()],
);
Auth::login($user);
return redirect('/');
});
sub è pairwise: lo stesso per ogni app della Sua organizzazione, diverso per ogni altra organizzazione. Per una persona non cambia mai, mentre un indirizzo email può cambiare. Salvi sub come chiave dell’account e tratti email come dato di contatto.
Altro per gli sviluppatori
Documentazione per sviluppatoriTutte le guide all’integrazioneQualsiasi libreria OpenID ConnectPrezzi