OAuth2 Client

Ce plugin fournit à SPIP une implémentation native du protocole OAuth2 ainsi que de son extension OpenID Connect.
Il permet à un site SPIP d’agir
-  comme client d’un serveur d’autorisation OAuth2,
-  comme client d’un fournisseur d’identité OpenID Connect
-  ou comme client d’une API métier protégée par OAuth2.

L’implémentation est autonome et ne repose sur aucune bibliothèque tierce (ni Composer, ni league/oauth2-client...). Il constitue essentiellement une brique technique destinée à être utilisée par d’autres plugins qui, eux, exposent une API.

Client OAuth2 générique pour SPIP.

Ce plugin fournit une API native permettant à d’autres plugins SPIP d’utiliser des services OAuth2 ou OpenID Connect (OIDC), sans dépendance à une bibliothèque OAuth2 externe.

Il prend en charge les flux :

  • authorization_code
  • refresh_token
  • client_credentials

Il prend également en charge PKCE et OpenID Connect.

Le plugin est avant tout une brique technique : il ne fournit pas d’interface utilisateur pour configurer un fournisseur OAuth2. Les plugins qui l’utilisent fournissent leur propre configuration et leur propre interface si nécessaire.

Installation

Le plugin s’installe comme les autres plugins SPIP.

Pré-requis

  • SPIP 4.0 ou supérieur
  • PHP 8.x
  • extension PHP OpenSSL
  • extension PHP cURL

Aucune bibliothèque OAuth2 externe n’est nécessaire.

Configuration

OAuth2 Client ne possède pas de configuration générale obligatoire dans l’espace privé.

La configuration d’un fournisseur OAuth2 est fournie par le plugin qui utilise OAuth2 Client.

Deux possibilités sont prévues :

  • utiliser le provider générique, en fournissant les endpoints et les paramètres nécessaires ;
  • utiliser un provider spécifique, fourni par un plugin tiers.

Le provider générique permet notamment de configurer :

  • l’endpoint d’autorisation ;
  • l’endpoint de token ;
  • l’identifiant et le secret du client ;
  • l’URL de redirection ;
  • les scopes ;
  • PKCE ;
  • OpenID Connect.

Utilisations

Obtenir un access token

Pour un flux utilisateur authorization_code, l’API principale est :

include_spip('inc/oauth2_client');

$token = oauth2_client_get_access_token(
    $app,
    $config,
    $mode = 'session',
    $id_user = null
);

$app est l’identifiant de la configuration OAuth2 utilisée.

Le paramètre $mode définit le contexte de stockage du token :

  • session : token associé à la session courante ;
  • user : token associé à un auteur SPIP ;
  • cron : token technique global.

En mode user, $id_user est l’identifiant (id_auteur) de l’auteur SPIP auquel le token doit être associé.

Le token est alors stocké par OAuth2 Client et associé à cet auteur SPIP. Cette association permet notamment de retrouver ultérieurement le token et les informations d’identité qui lui sont associées avec oauth2_client_get_user().

oauth2_client_get_access_token() gère le cycle du flux authorization_code :

  • récupération d’un token encore valide ;
  • échange du code d’autorisation ;
  • PKCE, lorsqu’il est activé ;
  • validation OpenID Connect, lorsqu’elle est activée ;
  • renouvellement du token avec un refresh_token ;
  • stockage du token.

En mode session, l’appel peut déclencher la redirection vers le fournisseur OAuth2 lorsque l’autorisation de l’utilisateur est nécessaire.

Exemple avec le provider générique

L’exemple suivant utilise le provider générique en mode user. Le token obtenu est associé à l’auteur SPIP identifié par $id_auteur.

include_spip('inc/oauth2_client');

$token = oauth2_client_get_access_token(
    $app,
    [
        'provider'           => 'generic',
        'authorize_endpoint' => 'https://provider.example/authorize',
        'token_endpoint'     => 'https://provider.example/token',
        'client_id'          => $client_id,
        'client_secret'      => $client_secret,
        'redirect_uri'       => $redirect_uri,
        'scope'              => 'openid profile email',

        'pkce' => [
            'enabled' => true,
            'method'  => 'S256',
        ],

        'oidc' => [
            'enabled' => true,
        ],

        'issuer' => 'https://provider.example',
    ],
    'user',
    $id_auteur
);

La configuration exacte dépend du fournisseur utilisé.

Récupérer les informations d’identité

Lorsqu’un token OAuth2/OIDC a été enregistré pour un utilisateur SPIP, les informations d’identité associées à ce token peuvent être récupérées avec :

include_spip('inc/oauth2_client');

$user = oauth2_client_get_user($app, 'user', $id_auteur);
  • $app : identifiant de la configuration OAuth2 utilisée ;
  • 'user' : contexte dans lequel le token a été enregistré ;
  • $id_auteur : identifiant (id_auteur) de l’utilisateur SPIP auquel le token est associé.

La fonction recherche le token correspondant et retourne les informations d’identité qui lui sont associées.

Lorsque le token contient un id_token OpenID Connect, les informations d’identité peuvent notamment être extraites de celui-ci :

[
    'sub'         => '',
    'email'       => '',
    'username'    => '',
    'given_name'  => '',
    'family_name' => '',
    'name'        => '',
]

Les champs disponibles dépendent des informations présentes dans l’id_token.

Fonctionnement

OAuth2 Client sépare les différentes responsabilités :

  • les providers décrivent la manière de communiquer avec un fournisseur OAuth2 ;
  • les grants implémentent les différents flux OAuth2 ;
  • le stockage gère les tokens et le contexte des échanges ;
  • les pipelines permettent aux plugins tiers d’adapter le comportement du plugin.

Providers

Un provider peut être :

  • générique, avec les endpoints fournis dans la configuration ;
  • spécifique, lorsqu’un fournisseur nécessite une implémentation particulière.

Un provider spécifique peut être fourni par un autre plugin sans modifier le plugin OAuth2 Client.

Grants

Les grants actuellement pris en charge sont :

  • authorization_code
  • refresh_token
  • client_credentials

Pipelines

Trois pipelines principaux permettent aux plugins tiers d’intervenir dans le fonctionnement d’OAuth2 Client :

  • oauth2_client_authorization_provider : provider utilisé pour générer l’URL d’autorisation ;
  • oauth2_client_token_provider : provider utilisé pour obtenir ou rafraîchir un token ;
  • oauth2_client_grant : grant utilisé pour un type de flux OAuth2.

Sécurité

Le plugin prend en charge notamment :

  • génération et vérification du state ;
  • stockage temporaire du contexte OAuth2 ;
  • PKCE avec la méthode S256 ;
  • nettoyage des contextes temporaires ;
  • gestion de l’expiration et du renouvellement des tokens ;
  • validation des données OpenID Connect ;
  • validation cryptographique des JWT via OpenSSL.

Développement et ToDo

OAuth2 Client est conçu pour être extensible sans modifier son cœur.

Les extensions doivent privilégier :

  • les providers spécifiques ;
  • les grants spécifiques ;
  • les pipelines prévus par le plugin.

Le provider générique permet de répondre à l’essentiel des cas d’usage sans avoir besoin d’en créer de nouveraux spécifiques. De même pour les grants fournis.

Discussion

One discussion

  • 1

    Bonjour,
    Je suis abonné au flux RSS de SPIP-Contrib.
    Je viens de recevoir, aujourd’hui, ce message daté du 06/04/26 19:09.
    Thunderbird 153.0.2 (64 bits)

    • Bonjour Rico,

      Il s’agit bien des derniers plugins sur contrib, dont OAuth2_Client qui permet à d’autres plugins SPIP d’utiliser le protocole Oauth2 pour accéder de façon sécurisé à des données de serveurs tiers: Le plugin Login_Oauth2 qui permet de s’identifier au Back-Office SPIP avec Google, Facebook ou au OIDC (en utilisant OAuth2_Client)

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom