Skip to Content

SDK PHP (auris/sdk)

auris/sdk est le SDK PHP officiel d’Auris IAM. Il est entièrement autonome — aucune dépendance externe requise — et supporte PHP 7.4+.

Le SDK implémente le flux OAuth2 Authorization Code avec PKCE. Il gère automatiquement la génération du code verifier et du challenge, la vérification de l’état, l’échange de tokens et le rafraîchissement des tokens.


Prérequis

  • PHP 7.4+
  • Extensions : curl, openssl, session

Installation

composer require auris/sdk

AurisConfig

Toutes les options de configuration du client.

<?php use Auris\AurisConfig; $config = new AurisConfig([ 'domain' => 'auth.votredomaine.com', // Obligatoire 'clientId' => 'app_xxxxx', // Obligatoire 'redirectUri' => 'https://votresite.com/callback', // Obligatoire 'clientSecret' => 'cs_live_xxxxx', // Optionnel — requis pour les applications web confidentielles 'scope' => 'openid profile email', // Optionnel — défaut : 'openid profile email' 'tenant' => 'my-tenant', // Optionnel — défaut : 'default' 'tokenStore' => new SessionTokenStore(), // Optionnel — voir section Stockage ]);

Options :

OptionTypeObligatoireDéfautDescription
domainstringOui—Le domaine du tenant Auris, sans https://
clientIdstringOui—Client ID de l’application depuis la Console
redirectUristringOui—URL de callback enregistrée dans la Console
clientSecretstringNon—Client secret — requis pour les apps confidentielles
scopestringNon'openid profile email'Scopes OAuth2 séparés par des espaces
tenantstringNon'default'Identifiant tenant envoyé comme en-tête HTTP x-tenant
tokenStoreTokenStoreNonSessionTokenStoreImplémentation de stockage des tokens

AurisClient

Le point d’entrée principal du SDK.

<?php use Auris\AurisClient; use Auris\AurisConfig; $client = new AurisClient(new AurisConfig([ 'domain' => $_ENV['AURIS_DOMAIN'], 'clientId' => $_ENV['AURIS_CLIENT_ID'], 'redirectUri' => $_ENV['AURIS_REDIRECT_URI'], 'tenant' => $_ENV['AURIS_TENANT'], ]));

getLoginUrl(options?)

Génère l’URL de connexion OAuth2 avec un code PKCE verifier et un état aléatoire sécurisé. Mémorise le verifier et l’état dans la session.

Signature :

public function getLoginUrl(array $options = []): string

Options :

OptionTypeDescription
login_hintstringPré-remplit le champ email
screen_hint'signup'Ouvre l’écran d’inscription au lieu de la connexion
prompt'login' | 'none'Force la ré-authentification ou exige une session silencieuse
localestringDéfinit la langue de la page hébergée
connectionstringForce un alias de connexion SSO spécifique
<?php $loginUrl = $client->getLoginUrl([ 'login_hint' => '[email protected]', 'screen_hint' => 'signup', ]); header('Location: ' . $loginUrl); exit;

handleCallback(code, state)

Complète le flux OAuth2 en validant l’état, échangeant le code d’autorisation contre des tokens et stockant le résultat.

Signature :

public function handleCallback(string $code, string $state): TokenResult

Lève : AurisException si l’état ne correspond pas ou si l’échange de token échoue.

<?php try { $result = $client->handleCallback( $_GET['code'], $_GET['state'] ); header('Location: /dashboard'); exit; } catch (\Auris\AurisException $e) { echo 'Erreur de connexion : ' . $e->getMessage(); }

isAuthenticated()

Retourne true si un token d’accès valide (non expiré) est présent dans le store.

Signature :

public function isAuthenticated(): bool
<?php if (!$client->isAuthenticated()) { header('Location: /login'); exit; }

getUser()

Retourne les informations de l’utilisateur courant décodées depuis le token ID mémorisé.

Signature :

public function getUser(): ?AurisUser
<?php $user = $client->getUser(); if ($user) { echo 'Bonjour, ' . $user->firstName; echo 'Rôles : ' . implode(', ', $user->roles); }

getAccessToken()

Retourne le token d’accès courant. Rafraîchit automatiquement si le token est expiré et qu’un refresh token est disponible.

Signature :

public function getAccessToken(): ?string
<?php $token = $client->getAccessToken(); // Utiliser le token dans les requêtes API $ch = curl_init('https://api.votresite.com/data'); curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $token"]);

refreshToken()

Échange manuellement le refresh token pour une nouvelle paire de tokens.

Signature :

public function refreshToken(): TokenResult
<?php try { $result = $client->refreshToken(); echo 'Token rafraîchi. Expire dans : ' . $result->expiresIn . ' secondes'; } catch (\Auris\AurisException $e) { // Refresh token expiré ou révoqué — forcer la reconnexion header('Location: /login'); exit; }

logout(returnTo?)

Révoque le refresh token, supprime les tokens mémorisés et redirige optionnellement l’utilisateur.

Signature :

public function logout(?string $returnTo = null): void
<?php $client->logout('https://votresite.com'); // La redirection est effectuée automatiquement

Classes de Données

TokenResult

Retourné par handleCallback() et refreshToken().

interface TokenResult { public string $accessToken; public ?string $refreshToken; public int $expiresIn; // secondes avant expiration du token d'accès public string $tokenType; // 'Bearer' public ?string $idToken; public function getUser(): AurisUser; }

AurisUser

Représente un utilisateur authentifié.

interface AurisUser { public string $id; public string $sub; public string $email; public bool $emailVerified; public string $name; public string $firstName; public string $lastName; public string $username; public ?string $picture; public array $roles; // string[] public array $metadata; // array<string, mixed> public string $tenant; public string $createdAt; // datetime ISO 8601 }

Stockage des Tokens

Par défaut, le SDK utilise SessionTokenStore qui persiste les tokens dans $_SESSION. Tu peux fournir ta propre implémentation en respectant l’interface TokenStore.

interface TokenStore { public function get(string $key): ?string; public function set(string $key, string $value): void; public function remove(string $key): void; }

Exemple — Stockage Redis :

<?php use Auris\TokenStore; class RedisTokenStore implements TokenStore { public function __construct(private \Redis $redis, private string $prefix = 'auris:') {} public function get(string $key): ?string { $value = $this->redis->get($this->prefix . $key); return $value !== false ? $value : null; } public function set(string $key, string $value): void { $this->redis->setex($this->prefix . $key, 86400, $value); // 24 heures } public function remove(string $key): void { $this->redis->del($this->prefix . $key); } } $config = new AurisConfig([ 'domain' => $_ENV['AURIS_DOMAIN'], 'clientId' => $_ENV['AURIS_CLIENT_ID'], 'redirectUri' => $_ENV['AURIS_REDIRECT_URI'], 'tokenStore' => new RedisTokenStore($redis), ]);

Gestion des Erreurs

Toutes les méthodes lèvent AurisException en cas d’erreur.

<?php use Auris\AurisException; try { $result = $client->handleCallback($_GET['code'], $_GET['state']); } catch (AurisException $e) { echo $e->getCode(); // ex. 'invalid_state', 'invalid_grant', 'network_error' echo $e->getMessage(); // Message lisible echo $e->getHttpStatus(); // Code de statut HTTP (ex. 400, 401, 500) }

Codes d’erreur courants :

CodeDescription
invalid_stateLe paramètre state ne correspond pas — possible attaque CSRF
invalid_grantCode d’autorisation expiré, déjà utilisé ou invalide
invalid_clientClient ID ou secret incorrect
network_errorImpossible de joindre le serveur d’autorisation Auris
token_expiredLe token d’accès est expiré et aucun refresh token n’est disponible
no_refresh_tokenrefreshToken() appelé mais aucun refresh token n’est mémorisé

Exemple PHP Vanilla (4 Fichiers)

Exemple complet d’une application PHP simple sans framework.

<?php // login.php session_start(); require 'vendor/autoload.php'; use Auris\AurisClient; use Auris\AurisConfig; $client = new AurisClient(new AurisConfig([ 'domain' => $_ENV['AURIS_DOMAIN'], 'clientId' => $_ENV['AURIS_CLIENT_ID'], 'redirectUri' => $_ENV['AURIS_REDIRECT_URI'], 'tenant' => $_ENV['AURIS_TENANT'], ])); $loginUrl = $client->getLoginUrl(); header('Location: ' . $loginUrl); exit;
<?php // callback.php session_start(); require 'vendor/autoload.php'; use Auris\AurisClient; use Auris\AurisConfig; use Auris\AurisException; $client = new AurisClient(new AurisConfig([ 'domain' => $_ENV['AURIS_DOMAIN'], 'clientId' => $_ENV['AURIS_CLIENT_ID'], 'redirectUri' => $_ENV['AURIS_REDIRECT_URI'], 'tenant' => $_ENV['AURIS_TENANT'], ])); try { $client->handleCallback($_GET['code'] ?? '', $_GET['state'] ?? ''); header('Location: /dashboard.php'); exit; } catch (AurisException $e) { http_response_code(400); echo 'Erreur de connexion : ' . htmlspecialchars($e->getMessage()); }
<?php // dashboard.php session_start(); require 'vendor/autoload.php'; use Auris\AurisClient; use Auris\AurisConfig; $client = new AurisClient(new AurisConfig([ 'domain' => $_ENV['AURIS_DOMAIN'], 'clientId' => $_ENV['AURIS_CLIENT_ID'], 'redirectUri' => $_ENV['AURIS_REDIRECT_URI'], ])); if (!$client->isAuthenticated()) { header('Location: /login.php'); exit; } $user = $client->getUser(); ?> <!DOCTYPE html> <html lang="fr"> <body> <h1>Bonjour, <?= htmlspecialchars($user->firstName) ?> !</h1> <p>Email : <?= htmlspecialchars($user->email) ?></p> <p>Rôles : <?= htmlspecialchars(implode(', ', $user->roles)) ?></p> <a href="/logout.php">Déconnexion</a> </body> </html>
<?php // logout.php session_start(); require 'vendor/autoload.php'; use Auris\AurisClient; use Auris\AurisConfig; $client = new AurisClient(new AurisConfig([ 'domain' => $_ENV['AURIS_DOMAIN'], 'clientId' => $_ENV['AURIS_CLIENT_ID'], 'redirectUri' => $_ENV['AURIS_REDIRECT_URI'], ])); $client->logout('https://votresite.com');

Intégration Laravel

Pour les applications Laravel, le SDK fournit un ServiceProvider et un middleware prêts à l’emploi.

1. Enregistrer le ServiceProvider

// config/app.php 'providers' => [ // ... Auris\Laravel\AurisServiceProvider::class, ],

2. Publier la configuration

php artisan vendor:publish --provider="Auris\Laravel\AurisServiceProvider"

Cela crée config/auris.php :

// config/auris.php return [ 'domain' => env('AURIS_DOMAIN'), 'client_id' => env('AURIS_CLIENT_ID'), 'client_secret' => env('AURIS_CLIENT_SECRET'), 'redirect_uri' => env('AURIS_REDIRECT_URI'), 'tenant' => env('AURIS_TENANT', 'default'), 'scope' => env('AURIS_SCOPE', 'openid profile email'), ];

3. Créer l’AuthController

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Auris\AurisClient; class AuthController extends Controller { public function __construct(private AurisClient $client) {} public function login() { return redirect($this->client->getLoginUrl()); } public function callback(Request $request) { try { $this->client->handleCallback( $request->query('code'), $request->query('state') ); return redirect('/dashboard'); } catch (\Auris\AurisException $e) { return redirect('/login')->withErrors(['auth' => $e->getMessage()]); } } public function logout() { $this->client->logout(config('app.url')); } }

4. Créer le middleware RequireAurisAuth

<?php namespace App\Http\Middleware; use Auris\AurisClient; use Closure; use Illuminate\Http\Request; class RequireAurisAuth { public function __construct(private AurisClient $client) {} public function handle(Request $request, Closure $next) { if (!$this->client->isAuthenticated()) { return redirect('/login'); } return $next($request); } }

5. Définir les routes

// routes/web.php use App\Http\Controllers\AuthController; use App\Http\Middleware\RequireAurisAuth; Route::get('/login', [AuthController::class, 'login']); Route::get('/auth/callback', [AuthController::class, 'callback']); Route::get('/logout', [AuthController::class, 'logout']); Route::middleware(RequireAurisAuth::class)->group(function () { Route::get('/dashboard', function () { $user = app(AurisClient::class)->getUser(); return view('dashboard', ['user' => $user]); }); });

Corrélés