Je travaille actuellement sur un plugin OAuth2 Client pour SPIP, en cours de finalisation, avec pour objectif de proposer un socle commun pour les plugins ayant besoin de dialoguer avec des API OAuth2 (Dropbox, Google, API internes, etc.), sans dépendance externe (pas de Composer, pas de librairie tierce).
Principes généraux
Implémentation OAuth2 (RFC 6749)
Support des flux :
authorization_code
refresh_token
client_credentials
Gestion complète du cycle de vie des tokens :
stockage en métas SPIP
expiration
rafraîchissement automatique
API procédurale simple (oauth2_client_xxx)
Aucun écran de configuration : les paramètres OAuth2 sont fournis dynamiquement à l’appel
Le plugin repose sur 3 API publiques :
oauth2_client_get_authorization_url(): Construit l’URL d’autorisation OAuth2
oauth2_client_get_token() : Appelle le endpoint token OAuth2
oauth2_client_get_access_token() : Retourne un access_token valide en utilisant le refresh_token si nécessaire (dérivée des 2 précédentes).
L’architecture fonctionnelle repose sur: Les providers :
Provider Generic : endpoints fournis inline lors de l’appel
Providers spécifiques : dédiés pour des APIs particulières (authentification client, paramètres spécifiques). Ils n’ont pas vocation à intégrer ce plugin mais peuvent être ajoutés afin d’étendre la classe générique; Il suffit de la placer dans un dossier provider/MonProvider.php (plugin ou squelettes) .
Les grants
Les grants implémentent les différents flux OAuth2 :
AuthorizationCode
RefreshToken
ClientCredentials
Chaque grant est une classe dédiée, permettant d’en ajouter de nouveaux si nécessaire.
Pipelines
Le plugin propose 3 pipelines permettant aux plugins tiers de modifier les composants OAuth2 :
oauth2_client_authorization_provider: intervenir sur le provider (Classe) utilisé pour modifier l’URL d’autorisation
oauth2_client_token_provider: intervenir sur le provider (Classe) utilisé pour l’échange ou le rafraîchissement du token
oauth2_client_grant: modifier le grant (Classe) OAuth2 utilisé
Ces pipelines sont appelés après les factories correspondantes, ce qui permet une extensibilité sans modifier le cœur du plugin.
Non c’est juste un client, donc c’est à chaque plugin qui a besoin de se connecter ailleurs avec OAuth d’appeler les fonctions PHP fournies, avec les bons paramètres (et donc c’est à chacun de ces plugins d’avoir leur propre configuration si besoin). Si j’ai bien compris
Là, j’ai créé un provider spécifique (Classe=Dropbox) uniquement pour ne pas à avoir à saisir en plus les 2 urls (autorisation + token) dans le Provider Generic (enregistrté une fois pour toutes dans la classe Dropbox)
ça va plus vite sans avoir à gérer les autorisations, token et refresh_token dans chauque plugin qui fait des appels Oauth2.
Et bé c’est super d’avoir un truc à jour pour ça, merci beaucoup. Ça peut être utile pour plein de besoin différents, donc c’est bien d’avoir un truc « agnostique » comme ça !
Je suis preneur ! Juste auparavant jeter un coup d’oeil formidable_pdf pour ne pas partir de zéro. Je te fais signe. Et par la même occasion échanger sur le « Provider » car tu m’as définitivement perdu
Je pense qu’en plus vu le projet, avoir des interfaces a encore plus de sens que dans mon cas, car le projet est précisment generique, ce qui n’est pas le cas dans formidable pdf.
Pour faire court, je pense qu’il y a 3 trucs qui feront gagner en qualité
interface
autoloader
namespace
Et ca tombe bien, ca fait partie des choses où je voulais proposer une formation dessus.
Mais j’irai voir oauth2_client aussi, j’ai justement un projet qui devrait débarquer dans les semaines à venir avec du Keycloak, il me semble que c’est en lien.
Déjà c’est top le readme en markdown pour un début de doc.
Pour info, si tu veux référencer ce plugin sur contrib.spip.net un jour (ce qui est encouragé), on a un modèle qui permet justement d’insérer un readme de git.spip.net directement dans un article sur Contrib (une sorte d’embed).
Ensuite on peut faire des PR sur le readme, ce qui met à jour Contrib, pratique (merci aussi à @maieul pour ça).
@nicod Oui, je vais certainement tester le modèle pour alimenter contrib depuis le readme.
Pour un accès avec Keycloak, il faudra certainement que j’implémente préalablement dans mon plugin OIDC (et/ou PKCE), ne serait-ce que pour récupérer et retourner l’id_token.