Se connecter avec un fournisseur d'identité externe
Sur cette page
Une entreprise partenaire a ses propres comptes et son propre fournisseur d’identité OpenID Connect. Ses employés doivent accéder à vos applications protégées par TOSIAM sans recevoir un mot de passe de plus : ils se connectent chez leur entreprise, et TOSIAM leur ouvre une session. TOSIAM délègue l’authentification au fournisseur du partenaire, vérifie la réponse, puis trouve le compte local de l’employé, ou le crée à sa première connexion.
Le code est dans le dépôt tosiam-samples, dossier tosiam-external-idp. Comme un vrai fournisseur (Microsoft Entra ID, Keycloak, Google Workspace…) ne se démarre pas sur un poste de développement, l’exemple contient un petit fournisseur OpenID Connect de démonstration, « Partenaire », en Node.js sans dépendance. Côté TOSIAM, rien ne dépend de ce fournisseur : la même configuration fonctionne avec n’importe quel fournisseur OpenID Connect.
-
Navigateur vers TOSIAM (royaume ref)
Page de connexion, chaîne
connexion-partenaire -
TOSIAM (royaume ref) vers Navigateur
Redirection vers le partenaire (
state,nonce, PKCE) - Navigateur vers Fournisseur Partenaire Identifiant et mot de passe du partenaire
-
Fournisseur Partenaire vers Navigateur
Retour vers TOSIAM avec un
code -
Navigateur vers TOSIAM (royaume ref)
OAuthProxy.jsp?code&state -
TOSIAM (royaume ref) vers Fournisseur Partenaire
POST /token:code,code_verifier, secret du client -
Fournisseur Partenaire vers TOSIAM (royaume ref)
access_token,id_tokensigné -
TOSIAM (royaume ref) vers Fournisseur Partenaire
GET /jwks(signature),GET /userinfo(profil) -
TOSIAM (royaume ref) vers Navigateur
Session TOSIAM du compte
partenaire-<sub>
Étape 1 : ce que le fournisseur doit offrir#
TOSIAM est un client du fournisseur du partenaire. Le partenaire déclare TOSIAM chez lui et vous communique :
| Information | Valeur dans l’exemple |
|---|---|
| Identifiant du client et son secret | tosiam-ref, tosiam-ref-secret |
| Adresse de retour à déclarer chez le partenaire | http://localhost:8080/tosiam/oauth2c/OAuthProxy.jsp |
Points d’accès (dans sa découverte /.well-known/openid-configuration) | http://localhost:8088/authorize, /token, /userinfo, /jwks |
Émetteur (iss) | http://localhost:8088 |
| Scopes | openid profile email |
L’adresse de retour est fixe : c’est la page oauth2c/OAuthProxy.jsp de TOSIAM, qui ramène le navigateur dans la chaîne en cours. Le fournisseur de l’exemple déclare ses utilisateurs et ce client dans fournisseur/partenaire.json, et sert sa découverte :
curl http://localhost:8088/.well-known/openid-configuration{
"issuer": "http://localhost:8088",
"authorization_endpoint": "http://localhost:8088/authorize",
"token_endpoint": "http://localhost:8088/token",
"userinfo_endpoint": "http://localhost:8088/userinfo",
"jwks_uri": "http://localhost:8088/jwks",
"response_types_supported": ["code"],
"code_challenge_methods_supported": ["S256"],
"id_token_signing_alg_values_supported": ["RS256"],
"authorization_response_iss_parameter_supported": true
}(extrait)
Étape 2 : l’instance du module OAuth 2.0 / OpenID Connect#
Dans la console legacy (bouton Console legacy de la console), royaume ref, Authentification, Modules, créez une instance de type OAuth 2.0 / OpenID Connect nommée partenaire. Le haut de sa configuration décrit le client et les adresses du fournisseur :
- PKCE activé, algorithme
S256: TOSIAM envoie uncode_challengeet prouve, au point de jeton, qu’il est bien celui qui a demandé le code. - Portée(s) : avec
openid, le module se comporte en client OpenID Connect : il envoie unnoncealéatoire, exige unid_tokenet le vérifie (signature,iss,aud= l’identifiant du client,nonceidentique à celui envoyé). Il vérifie aussi que la réponse userinfo porte le mêmesubque l’id_token. - URL du proxy : l’adresse de retour déclarée chez le partenaire.
Plus bas, la vérification de l’id_token :
- Émetteur du jeton : la valeur exacte attendue dans le
issde l’id_token. - Type de configuration de validation
jwk_urlet sa valeur : l’adresse de la JWKS du fournisseur, où TOSIAM prend la clé publique qui vérifie la signature. - Atténuation des confusions OAuth 2.0 : TOSIAM exige au retour les paramètres
issetclient_id, et refuse une réponse qui viendrait d’un autre fournisseur que celui qu’il a appelé.
Enfin, la recherche et la création du compte local :
| Réglage | Valeur | Effet |
|---|---|---|
| Mappeur de compte | …mapping.JsonAttributeMapper|uid|partenaire- | Les valeurs mappées vers uid reçoivent le préfixe partenaire- |
| Configuration du mappeur de compte | sub=uid | Le compte local est cherché par uid = partenaire-<sub> |
| Mappeur d’attributs | …mapping.JsonAttributeMapper|uid|partenaire- | Même préfixe à la création |
| Configuration du mappeur d’attributs | sub=uid, given_name=givenname, family_name=sn, name=cn, email=mail | Le compte créé s’appelle partenaire-<sub>, avec prénom, nom et e-mail du partenaire |
| Créer le compte s’il n’existe pas | activé | Première connexion : création |
| Demander un mot de passe et un code d’activation | désactivé | Sinon, TOSIAM envoie un code par e-mail (SMTP requis) et fait choisir un mot de passe |
sub est l’identifiant stable de l’employé chez le partenaire : il ne change pas quand son nom ou son e-mail changent. Le préfixe sépare les comptes de plusieurs fournisseurs et évite toute collision avec un compte local existant. Sans sub=uid à la création, le compte reçoit un nom aléatoire (un UUID).
Avec ssoadm, l’exemple applique ces réglages depuis tosiam/partenaire-module.properties :
ssoadm create-auth-instance --realm ref --name partenaire --authtype OAuth
ssoadm update-auth-instance --realm ref --name partenaire --datafile partenaire-module.propertiesÉtape 3 : la chaîne#
Une chaîne connexion-partenaire (Authentification, Chaînes) qui ne contient que le module, Obligatoire :
ssoadm create-auth-cfg --realm ref --name connexion-partenaire
ssoadm update-auth-cfg-entr --realm ref --name connexion-partenaire --entries "partenaire|REQUIRED"On l’ouvre avec le paramètre service de la page de connexion :
http://localhost:8080/tosiam/XUI/?realm=/ref&service=connexion-partenaire#loginUn lien « Se connecter avec le compte Partenaire » sur votre portail pointe vers cette adresse.
Étape 4 : se connecter#
cd tosiam-external-idp
./up.shOuvrez l’adresse de l’étape 3. TOSIAM envoie aussitôt le navigateur chez le partenaire, qui affiche sa propre page de connexion :
Connectez-vous avec lucie.martin / Lucie-Partenaire-2026. Le partenaire renvoie le navigateur vers TOSIAM, qui échange le code, vérifie l’id_token, lit le profil et ouvre une session dans le royaume ref. À la première connexion, le compte partenaire-p-1002 est créé avec le prénom, le nom et l’e-mail de Lucie :
Aux connexions suivantes, TOSIAM retrouve le même compte par son uid. Dans la console, royaume ref, Identités :
ref (1) et le compte créé par la connexion de Lucie (2).Ce compte a un mot de passe aléatoire que personne ne connaît : il ne sert qu’à travers le partenaire. Désactiver l’employé chez le partenaire suffit à lui couper l’accès, à la prochaine connexion.
Le journal du fournisseur (.tosiam/fournisseur.log) montre les quatre étapes vues de l’autre côté, sans aucun secret :
2026-10-11T12:37:56.674Z connexion demandée par tosiam-ref
2026-10-11T12:37:56.694Z lucie.martin connecté, retour vers tosiam-ref
2026-10-11T12:37:56.733Z jetons émis à tosiam-ref pour lucie.martin
2026-10-11T12:37:56.736Z profil lu pour lucie.martinSi l’employé choisit Annuler chez le partenaire, le partenaire renvoie le navigateur vers TOSIAM avec une erreur (error=access_denied) au lieu d’un code. TOSIAM vérifie que la réponse correspond bien à sa demande (state), puis XUI affiche la raison de l’échec ; Return to Login Page relance la connexion chez le partenaire :
Relier un compte existant par l’e-mail#
Si vos utilisateurs ont déjà un compte TOSIAM et que le partenaire envoie la même adresse e-mail, on peut vouloir les relier. Ajoutez email=mail à la Configuration du mappeur de compte : TOSIAM cherche alors un compte dont l’uid ou l’e-mail correspond (recherche en OU sur tous les attributs mappés).
Sans ce réglage, l’e-mail ne compte pas : dans l’exemple, donald.duck a chez le partenaire la même adresse que dduck (donald_duck@tosiam.io), et sa première connexion crée un compte partenaire-p-1003, distinct de dduck.
Les clés du fournisseur#
TOSIAM garde en cache la JWKS du fournisseur. Quand un id_token arrive avec un kid qu’il ne connaît pas, il relit la JWKS, au plus une fois par minute. Conséquences :
- une rotation de clé sous un nouveau
kidfonctionne : au pire, les connexions échouent pendant moins d’une minute ; - une nouvelle clé sous le même
kidn’est jamais relue : toutes les connexions échouent (« Unable to login to TOSIAM ») jusqu’au redémarrage de TOSIAM.
Le fournisseur de l’exemple crée sa clé une fois (.tosiam/fournisseur-cle.pem) et prend pour kid l’empreinte de la clé (RFC 7638) : une nouvelle clé a toujours un nouveau kid. Après ./delete.sh, qui supprime la clé, comptez une minute avant que la connexion refonctionne.
Pourquoi un serveur séparé#
Pour essayer, on peut être tenté de prendre un second royaume du même TOSIAM comme fournisseur. Dans un navigateur, cela ne fonctionne pas : les deux royaumes partagent le même cookie de session et le même nom d’hôte. Au retour du « fournisseur », XUI voit une session d’un autre royaume, propose d’en changer (#confirmLogin), et la chaîne n’aboutit pas. Le fournisseur doit être un autre serveur, avec ses propres cookies : c’est le rôle du petit fournisseur de l’exemple.
En cas de problème#
| Symptôme | Cause probable |
|---|---|
| « Le fournisseur d’identité a refusé la demande de connexion. » au retour | Le partenaire a renvoyé une erreur au lieu d’un code (invalid_scope, server_error…) : voir son journal |
| Le partenaire affiche « Demande refusée : adresse de retour non déclarée » | L’URL du proxy du module n’est pas déclarée chez le partenaire, au caractère près |
| « Unable to login to TOSIAM » au retour | id_token refusé (signature, émetteur, audience, nonce absent ou différent), réponse userinfo d’un autre sub, mauvais secret du client, ou fournisseur injoignable depuis le serveur TOSIAM : voir le journal d’authentification de TOSIAM au niveau message |
| Même symptôme pendant une minute après un changement de clé | La JWKS n’est relue qu’une fois par minute pour un kid inconnu |
| Même symptôme, durablement, après un changement de clé | Nouvelle clé sous le même kid : changez de kid, ou redémarrez TOSIAM |
| Le compte créé porte un nom aléatoire | sub=uid absent de la configuration du mappeur d’attributs |
| TOSIAM demande un mot de passe et un code reçu par e-mail | Demander un mot de passe et un code d’activation est activé |
| XUI propose de changer de royaume au retour | Le « fournisseur » est un royaume du même serveur : voir Pourquoi un serveur séparé |
En production#
- HTTPS partout : la page de connexion de TOSIAM, l’adresse de retour et tous les points d’accès du fournisseur.
- Le secret du client dans la configuration de TOSIAM seulement, jamais dans un dépôt ; ou, si le fournisseur le permet, une authentification par clé.
- Recherche par
subpréfixé, pas par l’e-mail (voir plus haut). - Un fournisseur qui recopie le
noncedans l’id_token, comme l’exige OpenID Connect : sinon, toutes les connexions sont refusées. - Les journaux : au niveau
message, le module n’écrit ni le code, ni lecode_verifier, ni les jetons, ni la réponse userinfo, seulement leur présence. La fiche de l’utilisateur (nom, e-mail…), en revanche, y figure encore : n’activez ce niveau que le temps d’un diagnostic, et purgez le journal ensuite. - Le cycle de vie : un employé qui quitte le partenaire ne peut plus se connecter, mais son compte
partenaire-…reste dans TOSIAM ; prévoyez son nettoyage.
Pour aller plus loin#
- Délégation entre API avec le token exchange : une fois connecté, appeler des API au nom de l’utilisateur.
- Créer un module d’authentification : les modules et les chaînes vus de l’intérieur.
- Nœuds : Social Login / OIDC : la même connexion dans un graphe d’authentification, avec la nouvelle interface de connexion.
Mis à jour le