Fournisseurs d’identité
ZeroClaw connecte les utilisateurs via OpenID Connect et se montre strict quant au jeton d’accès émis par le fournisseur. La plupart des fournisseurs nécessitent des modifications de configuration, et certains ne fonctionnent pas encore. Cette page répertorie ce dont un fournisseur a besoin, les fournisseurs testés avec les versions préliminaires v0.9.0, ceux dont on sait qu’ils ne fonctionnent pas encore, ainsi que les limitations actuelles. Seuls les fournisseurs listés sous Fournisseurs testés sont connus pour fonctionner. Pour configurer un fournisseur, consultez OIDC et Connexion au tableau de bord.
Le démon vérifie chaque jeton d’accès selon les mêmes règles, qu’il arrive par la connexion au tableau de bord ou depuis un client natif (zerocode, ou un jeton issu de zeroclaw oidc login). Un fournisseur dont le jeton d’accès est refusé l’est donc partout. zeroclaw oidc login et zeroclaw oidc token se contentent de récupérer un jeton et de l’afficher. Une connexion réussie à ce stade ne prouve pas que le démon accepte le jeton.
Ce dont un fournisseur a besoin
- Découverte.
<issuer>/.well-known/openid-configurationdoit désigner exactement l’issuerconfiguré, barre oblique finale incluse. - PKCE avec S256, pour la connexion par navigateur. La connexion au tableau de bord,
zeroclaw oidc login --browseret l’enregistrement par navigateur de la passerelle exigent que le document de découverte listeS256danscode_challenge_methods_supported. Ils refusent un émetteur qui omet ce champ, car un champ absent signifie l’absence de PKCE, etplainn’est jamais accepté. La grant device etclient_credentialsne lisent pas ce champ. - Le grant Device pour
zerocodeetzeroclaw oidc login.zerocode, ainsi quezeroclaw oidc loginsans--browser, se connectent avec le Device Authorization Grant (RFC 8628) ; le fournisseur doit donc le proposer et listerdevice_authorization_endpointdans la découverte. La connexion au tableau de bord n’utilise pas ce grant. - Un jeton d’accès que ZeroClaw peut vérifier, via l’un des deux modes
validation:jwks: un jeton d’accès JWT conforme à la RFC 9068, avec l’en-têtetypat+jwt(ouapplication/at+jwt), signé avec RS256 ou ES256. Il doit conteniriss,aud,exp,iatetjti, et désigner son client dansclient_id(pour le jeton d’une personne,azpest accepté à la place). Chaque clé de l’ensemble de clés de l’émetteur doit avoir son proprekid. Un JWT typéJWTou sanstyp, ce que de nombreux fournisseurs émettent par défaut, est refusé, car il ne peut pas être distingué d’un jeton d’identifiant.introspection: introspection de jeton RFC 7662 dont la réponse contientactive: true,token_type: Bearer, leaudienceconfiguré et unclient_id. Le document de découverte doit listerintrospection_endpoint. Ce mode nécessite leclient_secretde l’entrée.
- Rien qui le désigne comme un autre type de jeton. Dans les deux modes, le jeton (ou la réponse d’introspection) ne doit pas contenir de revendication
nonce. Une revendicationtypoutoken_use, si elle est présente, doit désigner un jeton d’accès :typBearerouat+jwt, ettoken_useexactementaccess. - Le public visé. L’
auddu jeton d’accès doit contenir l’audienceconfigurée. - Rôles ou groupes sans scope supplémentaire. ZeroClaw ne demande que le scope
openid, donc les valeurs àclaim_pathdoivent figurer dans le jeton d’accès (ou dans la réponse d’introspection) par défaut. Sinon, associez les personnes une à une, par exemple avecclaim_path = "sub". - Authentification du client selon la requête. L’échange du code d’autorisation (connexion au tableau de bord,
zeroclaw oidc login --browseret l’enrôlement par navigateur de la passerelle) envoie leclient_secretdans le corps du formulaire (client_secret_post). L’introspection, le flux device etclient_credentialsl’envoient avec HTTP Basic (client_secret_basic). Un fournisseur qui n’accepte que la méthode enregistrée pour un client peut nécessiter une entrée[oidc.<alias>]distincte et un client distinct pour le flux device ouclient_credentials. La connexion au tableau de bord avecintrospectionne peut pas être séparée de cette manière : un même client effectue à la fois l’échange et l’appel d’introspection, il doit donc accepter les deux méthodes. - Une durée de vie de jeton de session de travail, par exemple de une à huit heures. Le tableau de bord n’utilise pas de jetons d’actualisation ; une session prend fin lorsque son jeton d’accès expire.
Fournisseurs testés
Chaque fournisseur ci-dessous a connecté un compte administrateur et un compte membre via la connexion au tableau de bord, avec les profils auxquels leurs revendications sont associées. Sur le chemin bearer, le jeton d’identité, le jeton de rafraîchissement et un jeton d’accès émis pour un autre de ses clients, tous issus du même fournisseur, ont chacun été refusés. Les tests ont été exécutés sur des versions préliminaires v0.9.0 en octobre et novembre 2026. Keycloak a été testé avec la passerelle en HTTP simple et sur son propre écouteur TLS, ainsi qu’avec zerocode et zeroclaw oidc login. Zitadel et Authelia n’ont été testés qu’avec la connexion au tableau de bord.
| Fournisseur | Version testée | validation |
|---|---|---|
| Keycloak | 26.8.0 | jwks or introspection |
| Zitadel, auto-hébergé | v4.20.1 | introspection |
| Authelia | 4.39.28 | jwks |
Keycloak
- Activez l’en-tête de jeton d’accès RFC 9068 du client (
access.token.header.type.rfc9068 = true), exigez PKCES256et définissez une durée de vie du jeton d’accès comprise entre une et huit heures. La valeur par défaut de Keycloak est de cinq minutes. - Ajoutez un mappeur d’audience qui place le
audienceconfiguré dans le jeton d’accès. - Ajoutez un mappeur d’appartenance à un groupe avec le nom de revendication de jeton
groups, sans chemins complets, pourclaim_path = "groups". - Le client testé avait également un mappeur de claim
client_idcodé en dur. Sans celui-ci, voir Attribution du client dans le jeton d’accès Keycloak. - Pour
introspection, ajoutez aussi un mappage d’audience contenant l’ID du client lui-même. À partir de la version 26.6.2, Keycloak indique dans la réponse d’introspection qu’un jeton est inactif s’il ne désigne pas le client qui effectue la demande.
Zitadel
- Créez une application Web dont la méthode d’authentification est Code (HTTP Basic) ou Post. Les deux ont été testés. Ne choisissez pas la méthode PKCE : elle crée un client sans secret, or
introspectionen nécessite un. ZeroClaw envoie un défi PKCE avec l’une ou l’autre. - Attribuez un rôle à chaque personne du projet. Le projet testé avait également l’assertion de rôle activée.
- Définissez
audiencesur l’ID du projet etclaim_path = "urn:zitadel:iam:org:project:roles". jwksne fonctionne pas : les jetons d’accès de Zitadel sont opaques, ou sont des JWT de typeJWT.
Authelia
- Enregistrez le client avec
token_endpoint_auth_method: client_secret_post,access_token_signed_response_alg: RS256et PKCES256. La valeur par défautclient_secret_basicfait échouer l’échange de code. - Définissez l’
audiencedu client sur la valeur configuréeaudience, avecrequested_audience_mode: implicit. Le mode par défaut d’Authelia,explicit, n’ajoute une audience que lorsque le client en demande une, ce que ZeroClaw ne fait pas. - Associer les personnes une à une (
claim_path = "sub"). La revendication de groupe d’Authelia nécessite un scopegroups, que ZeroClaw ne demande pas. introspectionne fonctionne pas : la réponse d’introspection d’Authelia ne contient pas detoken_type.- Authelia sert son émetteur uniquement via HTTPS, son certificat doit donc remonter jusqu’à une autorité de certification que le démon considère comme fiable (voir Limitations).
Connu pour ne pas encore fonctionner
Ceux-ci ont été testés et aucune configuration ne fonctionne dans la v0.9.0 :
- Dex (v2.46.1). Ses jetons d’accès JWT n’ont pas de
typdans leur en-tête et portent le nonce de connexion, et son introspection marque les jetonstoken_use: access_tokentout en répondant de la même façon pour ses jetons ID. L’accepter permettrait d’utiliser un jeton ID comme jeton d’accès, donc il reste refusé. - Authentik (2026.8.5). Son jeton d’accès est de type
JWTet contient le nonce de connexion, et sa réponse d’introspection ne contient pas detoken_type. - Logto (1.45.0, testé avec
zeroclaw oidc loginet non avec le tableau de bord). Ses jetons d’accès pour les utilisateurs sont opaques, sauf si la requête de jeton indique une ressource RFC 8707resource, que ZeroClaw n’envoie pas encore. Les utilisateurs ne peuvent donc pas se connecter. Un client de service Logto utilisantclient_credentialsne fonctionne qu’avec une ressource API par défaut configurée et une clé de signature Logto migrée vers RSA : sa clé par défaut signe en ES384, que ZeroClaw ne vérifie pas.
Non testé. D’après leur documentation, leurs documents de découverte publiés et leur code source, ceux-ci ne devraient pas encore fonctionner :
- Amazon Cognito. Son document de découverte ne mentionne pas
S256, ses jetons d’accès n’ont pas detypdans leur en-tête, et il ne dispose d’aucun point de terminaison d’introspection. - Ory Hydra (v26.2.0). Ses jetons d’accès JWT sont de type
JWT, et son service d’introspection n’est disponible que sur son port d’administration et ne figure pas dans le document de découverte.
Tout autre fournisseur, hébergé ou auto-hébergé, n’a pas été testé. Vérifiez-le par rapport à Ce dont un fournisseur a besoin. Les principaux points bloquants sont les jetons d’accès dont le type n’est pas at+jwt, les jetons opaques sans introspection, et une découverte qui n’annonce pas S256.
Limites dans la v0.9.0
- Aucun paramètre
resourcede la RFC 8707. Les fournisseurs qui n’émettent un jeton d’accès vérifiable que pour une ressource nommée, comme Logto, ne peuvent pas encore authentifier les utilisateurs. - Aucune portée configurable. Chaque requête demande uniquement
openid, donc les revendications qu’un fournisseur ne transmet que pour une autre portée (souventgroups) n’arrivent jamais. - Aucune autorité de certification privée par fournisseur. Le certificat TLS de l’émetteur doit remonter jusqu’à une autorité de certification que le démon approuve déjà. Il n’existe aucun paramètre permettant d’en ajouter une pour un fournisseur donné.
- Les commandes d’administration de la passerelle de la CLI ne fonctionnent pas lorsque la passerelle sert elle-même le TLS (#12091).
- Les commandes concernées sont
zeroclaw gateway get-paircodesous toutes ses formes,zeroclaw sop pending,logs,approveetdeny, ainsi quezeroclaw gateway restart. - Ils se connectent toujours via
http://en clair, donc avec[gateway.tls]activé, la connexion échoue avec « Failed to connect to gateway ». zeroclaw gateway restartinterprète cet échec comme « aucune passerelle en cours d’exécution » et tente de démarrer une deuxième passerelle à la même adresse.
- Les commandes concernées sont
- Une panne du fournisseur lors de la nouvelle vérification d’une session déconnecte les utilisateurs du tableau de bord (#12096).
- La passerelle vérifie à nouveau le jeton de la session ouverte :
- à chaque échéance de revalidation d’introspection (
revalidation_secs); - après un rechargement de la configuration, dans l’un ou l’autre des modes
validation; - lorsque sa vérification des autorisations échoue parce que la politique a changé (une modification de
[oidc],[users],[permission_profiles]ousecurity.trust_daemon_uid).
- à chaque échéance de revalidation d’introspection (
- Si le fournisseur est injoignable à ce moment-là, ou répond par une erreur, la session se termine. Elle échoue en mode sécurisé : rien n’est admis qui ne devrait pas l’être.
- Le tableau de bord signale la session comme expirée. La passerelle consigne la cause réelle comme
dashboard session ended: verifying its token again failed. - Les utilisateurs se reconnectent une fois que le fournisseur est de nouveau disponible.
- Sans rechargement ni modification de politique, une session
jwksn’est pas revérifiée. Elle conserve son identité vérifiée jusqu’à l’expiration de son jeton ou de la session, quelle que soit la durée d’indisponibilité du fournisseur. - Le cache de clés de cinq minutes ne concerne que les jetons présentés pour la première fois, comme une nouvelle connexion
zerocode. Ce jeton est vérifié à partir des clés en cache pendant cinq minutes au maximum après la dernière récupération des clés, puis refusé jusqu’à ce que le fournisseur réponde. Un rechargement ou un changement de politique repart sans aucune clé en cache.
- La passerelle vérifie à nouveau le jeton de la session ouverte :
- Le chat du tableau de bord d’un compte à portée limitée ne dure que le temps de sa connexion. Recharger la page, quitter le chat ou une connexion interrompue met fin à la conversation, et un nouveau chat en démarre une autre. La transcription est conservée, mais le tableau de bord ne peut pas la rouvrir. Voir Connexion au tableau de bord.