Table of Contents

Application Native & Web basée sur le navigateur, type d’autorisation PKCE publique, sur la plateforme d’identité Mozaïk

Les applications installées sur un périphérique doivent disposer d’un moyen d’accès aux profils utilisateurs et aux ressources protégées, comme les API Web. Le flux OpenID Connect - Authorization Code Flow avec PKCE est utilisé pour exécuter des activités d’authentification et d’autorisation dans la majorité des types d’applications, notamment les applications monopages, les applications web et les applications installées de façon native. Le flux permet aux applications d’acquérir en toute sécurité des jetons d’identité, des jetons d’accès ainsi que des jetons d’actualisation pour obtenir des jetons d’accès supplémentaires.

Récupération des métadonnées OpenID Connect

Le document de métadonnées OpenID Connect Discovery 1.0 contient la plupart des informations nécessaires à une application pour effectuer la connexion. Cela inclut des informations telles que les URL à utiliser et l’emplacement des clés de signature publiques du service. Pour accéder à ce document, envoyez une requête GET au point de terminaison /.well-known/openid-configuration :

GET /{tenant_id}/.well-known/openid-configuration HTTP/1.1
Host: mozaikacces.ca
Paramètre Condition Description
tenant_id Facultatif L’identifiant de l’organisation ayant accordé à votre application les autorisations demandées. L’identifiant de l’organisation propriétaire de l’application est utilisé par défaut.
Astuce

Essayez! Cliquez sur https://mozaikacces.ca/.well-known/openid-configuration pour voir la configuration.

Exemple de réponse

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

{
   "authorization_endpoint": "https://mozaikacces.ca/connect/authorize",
   "end_session_endpoint": "https://mozaikacces.ca/connect/endsession",
   "issuer": "https://mozaikacces.ca",
   "jwks_uri": "https://mozaikacces.ca/.well-known/openid-configuration/jwks",
   "token_endpoint": "https://mozaikacces.ca/connect/token",
   "token_endpoint_auth_methods_supported": [
      "client_secret_basic",
      "client_secret_post"
   ],
   "userinfo_endpoint": "https://mozaikacces.ca/connect/userinfo"
   ...
}

Envoi d’une requête de connexion

Lorsque votre application web a besoin d’authentifier l’utilisateur, elle peut le diriger vers le point de terminaison /authorize :

Les sauts de ligne sont pour la lisibilité seulement.

GET /{tenant_id}/connect/authorize?
client_id=4de54d7b-cc83-4ad1-ac97-3a0c94288a10
&redirect_uri=https%3A%2F%2Flocalhost%2Fapp%2F
&response_type=code
&scope=openid%20offline_access&identity.read
&state=12345
&code_challenge=6bdtF8-K2j0v4FkNhfFSX4ZK7nyceCa1H-B2Y3qwTHs
&code_challenge_method=S256
HTTP/1.1
Host: mozaikacces.ca
Paramètre Condition Description
tenant_id Facultatif L’identifiant de l’organisation ayant accordé à votre application les autorisations demandées. L’identifiant de l’organisation propriétaire de l’application est utilisé par défaut.
À noter que si vous obtenez un jeton en passant un tenant id sur la route, vous devrez procéder ainsi pour les autres types de requêtes ({tenant_id}/connect/token, {tenant_id}/connect/userinfo, etc.)
client_id Obligatoire L’identifiant client attribué à votre application par l’environnement Espace API.
redirect_uri Obligatoire L’URI de redirection où vous souhaitez que la réponse soit envoyée pour être gérée par votre application. Il doit correspondre exactement à l’un des URI de redirection que vous avez inscrits dans l’environnement Espace API.
scope Obligatoire L’ensemble des autorisations demandées par l’application séparées par des espaces. Cela peut inclure les portées OpenID Connect (openid, profile, email, offline_access). La valeur doit correspondre à des portées que vous avez inscrites dans l’environnement Espace API. Les noms des portées sont sensibles à la casse.
response_type Obligatoire Le type de réponse à envoyer à votre application. La valeur doit inclure code pour le flux OpenID Connect - Authorization Code Flow.
response_mode Facultatif La méthode utilisée pour envoyer la réponse de la connexion à votre application. Les valeurs possibles sont form_post et fragment. Pour les applications web, nous vous recommandons d’utiliser la valeur form_post pour garantir le transfert le plus sécurisé des jetons à votre application. La valeur par défaut est fragment.
nonce Facultatif Une valeur incluse dans la requête, générée par l’application, qui sera intégrée dans la valeur id_token résultante en tant que revendication. L’application peut vérifier cette valeur afin de contrer les attaques par relecture de jetons. La valeur est généralement une valeur unique, aléatoire pouvant être utilisée pour identifier l’origine de la requête.
state Recommandé Une valeur incluse dans la requête, qui sera également renvoyée dans la réponse. Il peut s’agir d’une valeur votre choix. Une valeur unique générée de manière aléatoire est généralement utilisée pour empêcher les falsifications de requête intersite. La valeur d’état est également utilisée pour coder les informations sur l’état de l’utilisateur dans l’application avant la requête d’authentification, comme la page ou l’écran sur lequel ou laquelle il était positionné.
prompt Facultatif Le type d’interaction utilisateur requis. Les valeurs valides sont login, none et consent. La valeur login oblige l’utilisateur à saisir ses informations d’identification lors de cette requête, annulant de fait l’authentification unique. La valeur none a l’effet inverse. Cette valeur garantit qu’aucune invite interactive n’est présentée à l’utilisateur. Si la requête ne peut pas être exécutée en mode silencieux au moyen d’une authentification unique, le point de terminaison de la plateforme d’identité Mozaïk renvoie une erreur. La valeur consent déclenche l’affichage de la fenêtre de consentement une fois que l’utilisateur se connecte. La fenêtre invite l’utilisateur à accorder des autorisations à l’application.
login_hint Facultatif Le courriel utilisé pour remplir au préalable le champ réservé de la page de connexion de l’utilisateur dans le cas où vous le connaissez déjà. Les applications utilisent souvent ce paramètre au cours de la réauthentification, après avoir extrait le courriel à partir de la revendication email du jeton d’identité lors d’une connexion précédente.
ui_locales Facultatif Les langues de préférence utilisées pour l’affichage de l’interface utilisateur dans la page de connexion. Les langues doivent être séparées par des espaces comme dans cet exemple: fr-CA fr en.
max_age Facultatif La durée de vie maximale (en secondes) de la session utilisateur. Dépasser cette valeur, l’utilisateur sera obligé de saisir ses informations d’identification.
acr_values Facultatif Les informations additionnelles en lien avec la connexion séparées par des espaces comme dans cet exemple: idp:Microsoft info1:exemple. La valeur actuellement possible est idp:nom. Elle permet de passer outre la page de connexion de la plateforme d’identité Mozaïk pour rediriger l’utilisateur directement au fournisseur d’identité externe sélectionné. Les applications peuvent utiliser ce paramètre au cours de la réauthentification, après avoir extrait le fournisseur d’identité externe de la revendication idp du jeton d’identité lors d’une connexion précédente.
code_challenge Obligatoire Une valeur cryptographiquement aléatoire utilisée pour corréler la requête d’autorisation à la requête de jeton. Le client doit générer un code_verifier unique à chaque requête d’autorisation et le conserver pour la requête de jeton. La valeur du code_challenge correspond au hash SHA-256 encodé en Base64 URL. Pour plus d’informations, consultez le RFC 7636 - PKCE.
code_challenge_method Obligatoire La méthode utilisée pour encoder le code_verifier pour le paramètre code_challenge. La valeur doit être S256. La spécification déconseille l’utilisation de plain. Pour plus d’informations, consultez le RFC 7636 - PKCE.

À ce stade, l’utilisateur est invité à saisir ses informations d’identification et à exécuter l’authentification. Le point de terminaison de la plateforme d’identité Mozaïk vérifie que l’utilisateur a accepté les autorisations indiquées dans le paramètre de requête scope. Si l’utilisateur n’a pas accepté l’une ou plusieurs de ces autorisations, le point de terminaison de la plateforme d’identité Mozaïk lui demande de corriger ce manquement. Vous pouvez en savoir plus sur l’expérience du consentement de l’application.

Une fois que l’utilisateur a procédé à l’authentification et accordé son consentement, le point de terminaison de la plateforme d’identité Mozaïk renvoie une réponse à votre application au paramètre redirect_uri, à l’aide de la méthode spécifiée dans le paramètre response_mode.

Réponse réussie

Une réponse réussie lorsque vous utilisez response_mode=query ressemble à ceci :

Les sauts de ligne sont pour la lisibilité seulement.

HTTP/1.1 302 Found
Location: https://localhost/app/?
code=0c6b78fb5a234787dcef9d51ccbaab9ee9aa465b5ab33954d69e3172ac33dc94
&state=12345
&scope=openid%20offline_access&identity.read
&session_state=cPE4fNG93-elYcRBpmAznF0SsKaZByYf9dxYl...
Paramètre Description
code Le code d’autorisation demandé par l’application. L’application peut utiliser ce code d’autorisation pour demander un jeton d’accès pour la ressource cible. Les codes d’autorisation présentent une durée de vie courte. Généralement, ils expirent au bout de 10 minutes.
scope L’ensemble des autorisations accordées à votre application séparées par des espaces.
state L’application doit vérifier que les valeurs d’état de la requête et de la réponse sont identiques. Inclus si state inclut dans la requête initiale.
session_state La valeur de l’état de la session utilisateur. Ce paramètre doit être traité comme une valeur opaque. Inclus si scope inclut openid. Pour plus d’informations, consultez la spécification OpenID Connect Session Management 1.0 - draft 30.

Réponse d’erreur

Les réponses d’erreur peuvent également être envoyées au paramètre redirect_uri, de manière à ce que l’application puisse les traiter. Une réponse d’erreur lorsque vous utilisez response_mode=query ressemble à ceci :

Les sauts de ligne sont pour la lisibilité seulement.

HTTP/1.1 302 Found
Location: https://localhost/app/?
error=access_denied
&The%20resource%20owner%20or%20authorization%20server%20denied%20the%20request
&session_state=cPE4fNG93-elYcRBpmAznF0SsKaZByYf9dxYl...
Paramètre Description
error Un de code d’erreur que vous pouvez utiliser pour classer les types d’erreurs se produisant et intervenir face aux erreurs.
error_description Un message d’erreur spécifique qui peut vous aider à identifier la cause principale d’une erreur d’authentification.
session_state La valeur de l’état de la session utilisateur. Ce paramètre doit être traité comme une valeur opaque. Inclus si scope inclut openid. Pour plus d’informations, consultez la spécification OpenID Connect Session Management 1.0 - draft 30.

Validation de la réponse de connexion

La seule réception du code d’autorisation ne suffit pas à authentifier l’utilisateur. Vous devrez valider la réponse selon les directives de OIDC Authorization Code Flow - Authentication Response Validation.

Obtention des jetons

Maintenant que vous avez acquis un code d’autorisation et que l'utilisateur vous a octroyé une autorisation, vous pouvez échanger le code contre des jetons. Pour ce faire, envoyez une requête POST au point de terminaison /token :

Les sauts de ligne sont pour la lisibilité seulement.

POST /{tenant_id}/connect/token HTTP/1.1
Host: mozaikacces.ca
Content-Type: application/x-www-form-urlencoded

client_id=4de54d7b-cc83-4ad1-ac97-3a0c94288a10
&redirect_uri=https://localhost/app/
&scope=openid+offline_access+identity.read
&grant_type=authorization_code
&code=372d283f708636f21cefa450d053279748e2ab635ad3b7565534...
&code_verifier=X2qZ51vjL_b7RaTeTo8xD6ylEbGQDes6Bgp0zTsXSXg
Paramètre Condition Description
tenant_id Facultatif L’identifiant de l’organisation ayant accordé à votre application les autorisations demandées. L’identifiant de l’organisation propriétaire de l’application est utilisé par défaut.
client_id Obligatoire L’identifiant client attribué à votre application par l’environnement Espace API.
redirect_uri Obligatoire L’URI de redirection utilisé dans la requête de connexion.
grant_type Obligatoire La valeur doit être authorization_code.
code Obligatoire Le code en réponse à la requête de connexion.
code_verifier Obligatoire Le code_verifier utilisé dans la requête de connexion. Pour plus d’informations, consultez le RFC 7636 - PKCE.
scope Facultatif L’ensemble des autorisations demandées par votre application séparées par des espaces. La valeur doit correspondre à des portées que vous avez inscrites dans l’environnement Espace API. Les noms des portées sont sensibles à la casse. Toutes les portées configurées sont utilisées par défaut.

Réponse réussie connect/token

Une réponse réussie ressemble à ceci :

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
   "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBP...",
   "access_token": "NzUzODkyYzAtNGExOC00NGI0LWE5MzAtMjkyYWU3MzlkM2I5",
   "expires_in": 3600,
   "token_type": "Bearer",
   "refresh_token": "2c076cb5827c1d45cb5a90097af0d75deada13004990dfcc286ef7ce6d83841d",
   "scope": "openid offline_access identity.read"
}
Paramètre Description
id_token Le jeton d’identité demandé. L’application peut décoder les segments de ce jeton, afin de demander des informations relatives à l’utilisateur qui s’est connecté. L’application peut mettre en cache les valeurs et les afficher, mais elle ne peut pas les utiliser pour les limites d’autorisation ou de sécurité. Inclus si scope inclut openid.
access_token Le jetons d’accès demandé. L’application peut utiliser ce jeton pour procéder à l’authentification sur la ressource sécurisée, par exemple une API Web. Le jeton d’accès ne doit pas être décodé ou inspecté, il doit être traité comme une valeur opaque.
expires_in La durée de validité du jeton d’accès (en secondes).
token_type Le type de jeton d’accès. Le seul type pris en charge par la plateforme d’identité Mozaïk est Bearer.
refresh_token Le jeton d’actualisation demandé. L’application peut utiliser ce jeton pour acquérir des jetons d’accès supplémentaires après l’expiration du jeton d’accès actuel. Les jetons d’actualisation sont durables, et peuvent être utilisés pour conserver l’accès aux ressources pendant des périodes prolongées. Pour plus d’informations sur l’actualisation d’un jeton d’accès, reportez-vous à la section Actualisation des jetons. Inclus si scope inclut offline_access. Notez que la portée offline_access requerra toujours un consentement à chaque connexion pour un utilisateur qui ne fait pas partie d'une organisation.
scope L’ensemble des autorisations accordées à votre application séparées par des espaces.

Réponse d’erreur connect/token

Une réponse d’erreur ressemble à ceci :

HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
   "error":"invalid_grant"
}
Paramètre Description
error Un code d’erreur que vous pouvez utiliser pour classer les types d’erreurs se produisant et intervenir face aux erreurs.
error_description Un message d’erreur spécifique qui peut vous aider à identifier la cause principale d’une erreur d’authentification.

Utilisation d’un jeton d’accès

Maintenant que vous avez acquis un jeton d’accès, utilisez-le pour effectuer des demandes auprès de la ressource. Une requête ressemble à ceci :

GET {tenant_id}/connect/userinfo HTTP/1.1
Host: https://mozaikacces.ca
Authorization: Bearer NzUzODkyYzAtNGExOC00NGI0LWE5MzAtMjkyYWU3MzlkM2I5

Actualisation des jetons

Les jetons d’accès expirant après une courte période, votre application doit être préparée à les actualiser de manière régulière. Le jeton d’actualisation permet d’obtenir de nouvelles paires de jetons d’accès/actualisation. Pour ce faire, envoyez une requête POST au point de terminaison /token :

Les sauts de ligne sont pour la lisibilité seulement.

POST /{tenant_id}/connect/token HTTP/1.1
Host: mozaikacces.ca
Content-Type: application/x-www-form-urlencoded

client_id=4de54d7b-cc83-4ad1-ac97-3a0c94288a10
&grant_type=refresh_token
&refresh_token=2c076cb5827c1d45cb5a90097af0d75deada13004990dfcc286ef7ce6d83841d
Paramètre Condition Description
tenant_id Facultatif L’identifiant de l’organisation ayant accordé à votre application les autorisations demandées. L’identifiant de l’organisation propriétaire de l’application est utilisé par défaut.
client_id Obligatoire L’identifiant client attribué à votre application par l’environnement Espace API.
grant_type Obligatoire La valeur doit être refresh_token.
refresh_token Obligatoire Le refresh_token en réponse à la requête d’obtention des jetons ou celui de la requête d’actualisation précédente.

Réponse réussie refresh_token

La réponse réussie ressemble à celle de la requête d’Obtention des jetons.

Réponse d’erreur refresh_token

La réponse d’erreur ressemble à celle de la requête d’Obtention des jetons.

Révocation d’un jeton d’actualisation

Les jetons d’actualisation sont durables, il est essentiel de pouvoir les révoquer au cas où ils seraient compromis. Pour ce faire, envoyez une requête POST au point de terminaison /revocation :

Les sauts de ligne sont pour la lisibilité seulement.

POST /{tenant_id}/connect/revocation HTTP/1.1
Host: mozaikacces.ca
Content-Type: application/x-www-form-urlencoded

client_id=4de54d7b-cc83-4ad1-ac97-3a0c94288a10
&token=2c076cb5827c1d45cb5a90097af0d75deada13004990dfcc286ef7ce6d83841d
&token_type_hint=refresh_token
Paramètre Condition Description
tenant_id Facultatif L’identifiant de l’organisation ayant accordé à votre application les autorisations demandées. L’identifiant de l’organisation propriétaire de l’application est utilisé par défaut.
client_id Obligatoire L’identifiant client attribué à votre application par l’environnement Espace API.
token Obligatoire Le refresh_token en réponse à la requête d’obtention des jetons ou celui de la requête d’actualisation précédente.
token_type_hint Obligatoire La valeur doit être refresh_token.

Envoi d’une requête de déconnexion

Le point de terminaison endsession décrit dans OpenID Connect RP-Initiated Logout 1.0 - draft 01 permet à votre application d’envoyer une requête pour mettre fin à la session d’un utilisateur et effacer les cookies définis par le point de terminaison de la plateforme d’identité Mozaïk. Pour déconnecter complètement un utilisateur d’une application web, votre application doit mettre fin à sa propre session avec l’utilisateur (généralement en vidant un cache de jeton ou en supprimant les cookies), puis le rediriger vers le point de terminaison /endsession :

Les sauts de ligne sont pour la lisibilité seulement.

GET /{tenant_id}/connect/endsession?
id_token_hint=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBP...
&post_logout_redirect_uri=https%3A%2F%2Flocalhost%2Fapp%2F
HTTP/1.1
Host: mozaikacces.ca
Paramètre Condition Description
tenant_id Facultatif L’identifiant de l’organisation ayant accordé à votre application les autorisations demandées. L’identifiant de l’organisation propriétaire de l’application est utilisé par défaut.
id_token_hint Facultatif Le jeton d’identité demandé lors de la requête de connexion. S’il n’est pas inclus, le point de terminaison de la plateforme d’identité Mozaïk demande une confirmation de déconnexion à l’utilisateur.
post_logout_redirect_uri Facultatif L’URI de redirection après déconnexion où vous souhaitez que la réponse soit envoyée pour être gérée par votre application. Il doit correspondre exactement à l’un des URI de redirection après déconnexion que vous avez inscrits dans l’environnement Espace API. S’il n’est pas inclus, le point de terminaison de la plateforme d’identité Mozaïk affiche un message générique de déconnexion. Un id_token_hint est requis pour exécuter la redirection.
state Facultatif Une valeur incluse dans la requête, qui sera également renvoyée dans la réponse. Il peut s’agir d’une valeur de votre choix. Une valeur unique générée de manière aléatoire est généralement utilisée pour empêcher les falsifications de requête intersite. La valeur d’état est également utilisée pour coder les informations sur l’état de l’utilisateur dans l’application avant la requête d’authentification, comme la page ou l’écran sur lequel ou laquelle il était positionné.

Déconnexion unique

Lorsque vous redirigez l’utilisateur vers le point de terminaison endsession de la plateforme d’identité Mozaïk, la session de l’utilisateur est effacée de l’application. Toutefois, l’utilisateur peut rester connecté à d’autres applications qui utilisent des comptes Mozaïk pour s’authentifier. Pour permettre à ces applications de déconnecter simultanément l’utilisateur, le point de terminaison de la plateforme d’identité Mozaïk envoie une requête GET aux URI de déconnexion inscrits dans l’environnement Espace API pour toutes les applications auxquelles l’utilisateur est actuellement connecté. Les applications doivent répondre à cette requête en effaçant toute session qui identifie l’utilisateur et en renvoyant une réponse avec un code HTTP 200. Si vous souhaitez prendre en charge la déconnexion unique dans votre application, vous devez implémenter le paramètre frontchannel_logout_uri dans le code de votre application tel que décrit dans OpenID Connect Front-Channel Logout 1.0 - draft 04.