Aller au contenu principal

OpenID Connect

Semaphore prend en charge l'authentification via OpenID Connect (OIDC).

Liens :

Exemple de configuration d'un fournisseur SSO :

{
"oidc_providers": {
"mysso": {
"display_name": "Sign in with MySSO",
"color": "orange",
"icon": "login",
"provider_url": "https://mysso-provider.com",
"client_id": "***",
"client_secret": "***",
"redirect_url": "https://your-domain.com/api/auth/oidc/mysso/redirect"
}
}
}

Configuration via une variable d'environnement

Lors d'une exécution dans des conteneurs, il peut être pratique de configurer les fournisseurs à l'aide d'une seule variable d'environnement :

SEMAPHORE_OIDC_PROVIDERS='{
"github": {
"client_id": "***",
"client_secret": "***"
}
}'

Cette valeur doit être une chaîne JSON valide correspondant à la structure oidc_providers ci-dessus.

Toutes les options d'un fournisseur SSO :

ParamètreDescription
display_nameNom du fournisseur affiché sur l'écran de connexion.
iconIcône MDI affichée devant le nom du fournisseur sur l'écran de connexion.
colorNom du fournisseur affiché sur l'écran de connexion.
client_idID client du fournisseur.
client_id_fileChemin du fichier dans lequel est stocké l'ID client du fournisseur. A une priorité inférieure à client_id.
client_secretSecret client du fournisseur.
client_secret_fileChemin du fichier dans lequel est stocké le secret client du fournisseur. A une priorité inférieure à client_secret.
redirect_url
provider_url
scopes
username_claimExpression de claim du nom d'utilisateur*.
email_claimExpression de claim de l'e-mail*.
name_claimExpression de claim du nom de profil*.
orderPosition du bouton du fournisseur sur l'écran de connexion.
allow_idp_initiatedActive la connexion initiée par l'IdP pour ce fournisseur. Par défaut false.
return_via_stateTransmet le chemin de retour post-connexion via le paramètre OAuth state plutôt que via l'URL de redirection. Par défaut true.
endpoint.issuer
endpoint.auth
endpoint.token
endpoint.userinfo
endpoint.jwks
endpoint.algorithms

*Expression de claim

Exemple d'expression de claim :

email | {{ .username }}@your-domain.com

Semaphore tente d'abord de récupérer le champ email. S'il est vide, l'expression qui suit est évaluée.

L'expression "username_claim": "|" génère un username aléatoire pour chaque utilisateur qui se connecte via le fournisseur.

Connexion initiée par l'IdP

Par défaut, Semaphore ne prend en charge que la connexion initiée par le SP : l'utilisateur ouvre Semaphore, clique sur le bouton du fournisseur et est redirigé vers le fournisseur d'identité (IdP).

Avec la connexion initiée par l'IdP, le parcours peut au contraire commencer chez le fournisseur d'identité — par exemple en cliquant sur la tuile Semaphore dans le tableau de bord Okta, dans My Apps d'Azure ou dans un lanceur d'applications Keycloak / Authentik.

Semaphore implémente cela à l'aide du mécanisme standard Third-Party Initiated Login (OpenID Connect Core 1.0 §4). L'IdP redirige le navigateur vers une Initiate Login URI dédiée, puis Semaphore démarre un flux Authorization Code classique. L'authentification proprement dite reste un échange de code complet et sécurisé — Semaphore n'accepte jamais de token non sollicité.

Activation

Définissez allow_idp_initiated à true pour le fournisseur :

{
"oidc_providers": {
"mysso": {
"display_name": "Sign in with MySSO",
"provider_url": "https://mysso-provider.com",
"client_id": "***",
"client_secret": "***",
"redirect_url": "https://your-domain.com/api/auth/oidc/mysso/redirect",
"allow_idp_initiated": true
}
}
}

Configurer le fournisseur d'identité

Dans votre IdP, définissez l'Initiate Login URI de l'application à :

https://your-domain.com/api/auth/oidc/<provider-id>/initiate

<provider-id> est la clé sous oidc_providers (par exemple mysso).

L'IdP doit envoyer le paramètre iss (issuer) à ce point de terminaison ; Semaphore rejette les requêtes dont le iss ne correspond pas au fournisseur configuré. Le paramètre facultatif login_hint est transmis à l'IdP, et un paramètre facultatif target_link_uri définit la page à ouvrir après la connexion (il doit pointer vers Semaphore, sinon il est ignoré).

Remarques propres à certains fournisseurs :

  • Okta — définissez Login initiated by à Either Okta or App (ou App Only) et renseignez l'Initiate login URI. Okta envoie à la fois iss et target_link_uri.
  • Keycloak / Authentik / Ping / OneLogin — définissez l'URL de lancement / d'accueil de l'application à l'Initiate Login URI.
  • Azure AD / EntraMy Apps utilise une URL de démarrage initiée par le SP et n'envoie pas toujours iss ; faites plutôt pointer l'URL de démarrage vers https://your-domain.com/api/auth/oidc/<provider-id>/login.

Sécurité

  • La connexion initiée par l'IdP est désactivée par défaut et doit être activée pour chaque fournisseur.
  • Le paramètre iss est validé par rapport à l'issuer configuré afin d'éviter toute confusion entre fournisseurs.
  • target_link_uri n'est accepté que s'il pointe vers Semaphore (pas de redirection ouverte).
  • Le flux passe par l'échange Authorization Code complet avec un state CSRF et un nonce, de sorte qu'un token capturé ou rejoué ne peut pas être utilisé pour se connecter.

Écran de connexion

Pour chacun des fournisseurs configurés, un bouton de connexion supplémentaire est ajouté à la page de connexion :

Capture d'écran de la page de connexion de Semaphore, avec deux boutons de connexion. L'un indique « Sign In », l'autre « Sign in with MySSO »