TutorielGuides

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.

  1. Navigateur vers TOSIAM (royaume ref) Page de connexion, chaîne connexion-partenaire
  2. TOSIAM (royaume ref) vers Navigateur Redirection vers le partenaire (state, nonce, PKCE)
  3. Navigateur vers Fournisseur Partenaire Identifiant et mot de passe du partenaire
  4. Fournisseur Partenaire vers Navigateur Retour vers TOSIAM avec un code
  5. Navigateur vers TOSIAM (royaume ref) OAuthProxy.jsp?code&state
  6. TOSIAM (royaume ref) vers Fournisseur Partenaire POST /token : code, code_verifier, secret du client
  7. Fournisseur Partenaire vers TOSIAM (royaume ref) access_token, id_token signé
  8. TOSIAM (royaume ref) vers Fournisseur Partenaire GET /jwks (signature), GET /userinfo (profil)
  9. TOSIAM (royaume ref) vers Navigateur Session TOSIAM du compte partenaire-<sub>
La connexion se fait chez le partenaire ; TOSIAM vérifie la réponse côté serveur, puis ouvre sa propre session.

É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 :

Faites défiler le tableau
InformationValeur dans l’exemple
Identifiant du client et son secrettosiam-ref, tosiam-ref-secret
Adresse de retour à déclarer chez le partenairehttp://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
Scopesopenid 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 :

bash
curl http://localhost:8088/.well-known/openid-configuration
json
{
  "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 :

Console legacy, module partenaire : algorithme S256 et PKCE activé, identifiant du client tosiam-ref et secret, points d'accès du fournisseur, portées openid profile email, URL du proxy Console legacy, module partenaire : algorithme S256 et PKCE activé, identifiant du client tosiam-ref et secret, points d'accès du fournisseur, portées openid profile email, URL du proxy
PKCE en S256 (1), le client déclaré chez le partenaire (2), ses points d’accès (3), les scopes (4) et l’adresse de retour (5).
  • PKCE activé, algorithme S256 : TOSIAM envoie un code_challenge et 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 un nonce aléatoire, exige un id_token et le vérifie (signature, iss, aud = l’identifiant du client, nonce identique à celui envoyé). Il vérifie aussi que la réponse userinfo porte le même sub que 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 :

Console legacy, module partenaire : émetteur du jeton http://localhost:8088, validation OpenID Connect par jwk_url http://localhost:8088/jwks, atténuation des confusions OAuth 2.0 activée Console legacy, module partenaire : émetteur du jeton http://localhost:8088, validation OpenID Connect par jwk_url http://localhost:8088/jwks, atténuation des confusions OAuth 2.0 activée
L’émetteur attendu (1), la clé publique du fournisseur (2) et la protection contre les confusions entre fournisseurs (3).
  • Émetteur du jeton : la valeur exacte attendue dans le iss de l’id_token.
  • Type de configuration de validation jwk_url et 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 iss et client_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 :

Console legacy, module partenaire : mappeur de compte avec configuration sub=uid, mappeur d'attributs avec sub=uid, given_name=givenname, family_name=sn, name=cn, email=mail, création du compte activée, demande de mot de passe désactivée Console legacy, module partenaire : mappeur de compte avec configuration sub=uid, mappeur d'attributs avec sub=uid, given_name=givenname, family_name=sn, name=cn, email=mail, création du compte activée, demande de mot de passe désactivée
La recherche du compte (1), les attributs copiés (2), la création du compte (3), sans mot de passe à choisir (4).
Faites défiler le tableau
RéglageValeurEffet
Mappeur de compte…mapping.JsonAttributeMapper|uid|partenaire-Les valeurs mappées vers uid reçoivent le préfixe partenaire-
Configuration du mappeur de comptesub=uidLe 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’attributssub=uid, given_name=givenname, family_name=sn, name=cn, email=mailLe compte créé s’appelle partenaire-<sub>, avec prénom, nom et e-mail du partenaire
Créer le compte s’il n’existe pasactivéPremière connexion : création
Demander un mot de passe et un code d’activationdé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 :

bash
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 :

Console legacy, chaîne connexion-partenaire : un module partenaire OAuth 2.0 / OpenID Connect, critère Obligatoire Console legacy, chaîne connexion-partenaire : un module partenaire OAuth 2.0 / OpenID Connect, critère Obligatoire
Le module partenaire (1), obligatoire (2).
bash
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#login

Un lien « Se connecter avec le compte Partenaire » sur votre portail pointe vers cette adresse.

Étape 4 : se connecter#

bash
cd tosiam-external-idp
./up.sh

Ouvrez l’adresse de l’étape 3. TOSIAM envoie aussitôt le navigateur chez le partenaire, qui affiche sa propre page de connexion :

Page de connexion du fournisseur Partenaire : TOSIAM (royaume ref) vous demande de vous connecter avec votre compte Partenaire, identifiant lucie.martin, mot de passe masqué, boutons Annuler et Se connecter Page de connexion du fournisseur Partenaire : TOSIAM (royaume ref) vous demande de vous connecter avec votre compte Partenaire, identifiant lucie.martin, mot de passe masqué, boutons Annuler et Se connecter
L’application qui demande la connexion (1), l’identifiant du partenaire (2) et Se connecter (3).

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 :

Profil XUI de l'utilisateur partenaire-p-1002 : prénom Lucie, nom MARTIN, e-mail lucie.martin@partenaire.example Profil XUI de l'utilisateur partenaire-p-1002 : prénom Lucie, nom MARTIN, e-mail lucie.martin@partenaire.example
Le compte créé dans TOSIAM (1) et les informations reçues du partenaire (2). Cette page de XUI n’est pas encore traduite en français.

Aux connexions suivantes, TOSIAM retrouve le même compte par son uid. Dans la console, royaume ref, Identités :

Console, Identités du royaume ref : le compte partenaire-p-1002, prénom Lucie, e-mail lucie.martin@partenaire.example, actif Console, Identités du royaume ref : le compte partenaire-p-1002, prénom Lucie, e-mail lucie.martin@partenaire.example, actif
Le royaume 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 :

sortie
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.martin

Si 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 :

XUI après Annuler chez le partenaire : bandeau Connexion annulée chez le fournisseur d'identité, titre Unable to login to TOSIAM et lien Return to Login Page XUI après Annuler chez le partenaire : bandeau Connexion annulée chez le fournisseur d'identité, titre Unable to login to TOSIAM et lien Return to Login Page
La raison de l’échec (1) et le lien pour recommencer (2). Toute autre erreur du partenaire affiche « Le fournisseur d’identité a refusé la demande de connexion. »

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 kid fonctionne : au pire, les connexions échouent pendant moins d’une minute ;
  • une nouvelle clé sous le même kid n’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#

Faites défiler le tableau
SymptômeCause probable
« Le fournisseur d’identité a refusé la demande de connexion. » au retourLe 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 retourid_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éatoiresub=uid absent de la configuration du mappeur d’attributs
TOSIAM demande un mot de passe et un code reçu par e-mailDemander un mot de passe et un code d’activation est activé
XUI propose de changer de royaume au retourLe « 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 sub préfixé, pas par l’e-mail (voir plus haut).
  • Un fournisseur qui recopie le nonce dans 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 le code_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#

Mis à jour le