Laravel Socialite: logowanie przez OpenID Connect z PKCE
Logowanie przez Dazr Identity: bezpłatny OpenID Connect hostowany w UE, z passkeys, kodami e-mail i kontami Google lub Microsoft pod jednym przyciskiem.
Potrzebujesz trzech wartości z konsoli dla deweloperów: identyfikatora klienta, sekretu klienta (tylko aplikacje serwerowe) i zarejestrowanego URI przekierowania. Resztę zawiera dokument discovery pod adresem https://identity.dazr.eu/.well-known/openid-configuration.
Laravel
Laravel Socialite nie ma wbudowanego ogólnego sterownika OpenID Connect, więc dodaj mały własny sterownik. Kieruje on ludzi do Dazr z PKCE i odczytuje użytkownika z endpointu userinfo. Socialite nie czyta dokumentu discovery, dlatego endpointy są wpisane wprost. Zarejestruj aplikację serwerową z URI przekierowania 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 jest pairwise: taki sam dla każdej aplikacji Twojej organizacji i inny dla każdej innej organizacji. Dla danej osoby nigdy się nie zmienia, a adres e-mail może. Zapisuj sub jako klucz konta, a email traktuj jako dane kontaktowe.
Więcej dla deweloperów
Dokumentacja dla deweloperówWszystkie przewodniki integracjiDowolna biblioteka OpenID ConnectCennik