pismile

Intégrer pismile avec Laravel

Un fournisseur Socialite pismile, comptes liés au sub, connexion et déconnexion.

1 min de lecture · Mis à jour le · API v1

Connectez-vous pour voir vos propres identifiants sandbox dans les exemples.

Ce guide ajoute pismile à Laravel Socialite avec un petit fournisseur sur mesure, puis lie chaque utilisateur à son sub. Durée : 15 minutes.

  1. Installez Socialite

    Terminal
    composer require laravel/socialite
  2. Ajoutez 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'),
    ],
    .env
    PISMILE_CLIENT_ID=VOTRE_CLIENT_ID
    PISMILE_CLIENT_SECRET=votre_secret
    PISMILE_REDIRECT_URI=http://localhost:8000/auth/pismile/callback
    PISMILE_ISSUER=https://pismile.com
  3. Cré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.php
    use 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']);
        });
    }
  4. Préparez la table des utilisateurs

    pismile ne transmet pas d'e-mail : l'e-mail et le mot de passe deviennent facultatifs, le sub devient la clé.

    Terminal
    php artisan make:migration add_pismile_to_users_table
    database/migrations/xxxx_add_pismile_to_users_table.php
    public 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();
        });
    }
    Terminal
    php artisan migrate

    Ajoutez pismile_sub, pismile_country et pismile_category au tableau $fillable du modèle User.

  5. Ajoutez les routes

    routes/web.php
    use 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('/');
    });
  6. Testez

    Terminal
    php artisan serve

    Ouvrez http://localhost:8000/auth/pismile, connectez-vous avec un alias de test du sandbox BCEAO et confirmez la demande dans le playground : la table users contient votre utilisateur, identifié par pismile_sub.

Cette page vous a-t-elle aidé ?