Intégrer pismile avec Laravel
Un fournisseur Socialite pismile, comptes liés au sub, connexion et déconnexion.
Ce guide ajoute pismile à Laravel Socialite avec un petit fournisseur sur mesure, puis lie chaque utilisateur à son sub. Durée : 15 minutes.
Installez Socialite
Terminalcomposer require laravel/socialiteAjoutez la configuration
config/services.php'pismile' => [ 'client_id' => env('PISMILE_CLIENT_ID'), 'client_secret' => env('PISMILE_CLIENT_SECRET'), 'redirect' => env('PISMILE_REDIRECT_URI'), 'issuer' => env('PISMILE_ISSUER'), ],.envPISMILE_CLIENT_ID=VOTRE_CLIENT_ID PISMILE_CLIENT_SECRET=votre_secret PISMILE_REDIRECT_URI=http://localhost:8000/auth/pismile/callback PISMILE_ISSUER=https://pismile.comCréez le fournisseur pismile
Il utilise PKCE et envoie le secret dans l'en-tête
Authorization(client_secret_basic).app/Socialite/PismileProvider.php<?php namespace App\Socialite; use GuzzleHttp\RequestOptions; use Laravel\Socialite\Two\AbstractProvider; use Laravel\Socialite\Two\User; class PismileProvider extends AbstractProvider { protected $scopes = ['openid', 'profile']; protected $scopeSeparator = ' '; protected $usesPKCE = true; private function issuer(): string { return rtrim(config('services.pismile.issuer'), '/'); } protected function getAuthUrl($state) { return $this->buildAuthUrlFromBase($this->issuer() . '/oauth2/authorize', $state); } protected function getTokenUrl() { return $this->issuer() . '/oauth2/token'; } public function getAccessTokenResponse($code) { $fields = $this->getTokenFields($code); unset($fields['client_secret']); $response = $this->getHttpClient()->post($this->getTokenUrl(), [ RequestOptions::HEADERS => [ 'Accept' => 'application/json', 'Authorization' => 'Basic ' . base64_encode(urlencode($this->clientId) . ':' . urlencode($this->clientSecret)), ], RequestOptions::FORM_PARAMS => $fields, ]); return json_decode((string) $response->getBody(), true); } protected function getUserByToken($token) { $response = $this->getHttpClient()->get($this->issuer() . '/userinfo', [ RequestOptions::HEADERS => ['Authorization' => 'Bearer ' . $token, 'Accept' => 'application/json'], ]); 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, 'nickname' => null, 'email' => null, 'avatar' => null, ]); } }app/Providers/AppServiceProvider.phpuse App\Socialite\PismileProvider; use Laravel\Socialite\Facades\Socialite; public function boot(): void { Socialite::extend('pismile', function ($app) { return Socialite::buildProvider(PismileProvider::class, $app['config']['services.pismile']); }); }Préparez la table des utilisateurs
pismile ne transmet pas d'e-mail : l'e-mail et le mot de passe deviennent facultatifs, le
subdevient la clé.Terminalphp artisan make:migration add_pismile_to_users_tabledatabase/migrations/xxxx_add_pismile_to_users_table.phppublic function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('pismile_sub')->nullable()->unique()->after('id'); $table->string('pismile_country', 2)->nullable(); $table->string('pismile_category', 1)->nullable(); $table->string('email')->nullable()->change(); $table->string('password')->nullable()->change(); }); }Terminalphp artisan migrateAjoutez
pismile_sub,pismile_countryetpismile_categoryau tableau$fillabledu modèleUser.Ajoutez les routes
routes/web.phpuse App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; use Laravel\Socialite\Facades\Socialite; Route::get('/auth/pismile', fn () => Socialite::driver('pismile')->redirect())->name('login'); Route::get('/auth/pismile/callback', function () { $pismile = Socialite::driver('pismile')->user(); $user = User::updateOrCreate( ['pismile_sub' => $pismile->getId()], [ 'name' => $pismile->getName(), 'pismile_country' => $pismile->getRaw()['pismile_country'] ?? null, 'pismile_category' => $pismile->getRaw()['pismile_category'] ?? null, ], ); Auth::login($user, remember: true); request()->session()->regenerate(); return redirect()->intended('/compte'); }); Route::get('/compte', fn () => view('compte', ['user' => Auth::user()]))->middleware('auth'); Route::post('/logout', function (Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); });Testez
Terminalphp artisan serveOuvrez
http://localhost:8000/auth/pismile, connectez-vous avec un alias de test du sandbox BCEAO et confirmez la demande dans le playground : la tableuserscontient votre utilisateur, identifié parpismile_sub.
Cette page vous a-t-elle aidé ?
Merci, votre avis nous aide à améliorer la documentation.