Utilisation d'OpenID Connect pour étendre OAuth 2.0

OpenID Connect étend le protocole OAuth 2.0 pour ajouter une couche d'authentification et d'identité simple qui se trouve au-dessus de OAuth 2.0.

Utilisez OpenID Connect lorsque vous souhaitez que vos applications cloud obtiennent des informations d'identité, extraient des détails sur l'événement d'authentification (par exemple, quand, où et comment l'authentification s'est produite) et autorisent l'accès avec connexion unique fédéré (SSO).

OAuth 2.0 fournit des jetons de sécurité à utiliser lors de l'appel de ressources back-end au nom d'un utilisateur. OAuth fournit une autorisation ou une licence permettant d'accéder aux ressources plutôt que de fournir des informations sur l'authentification elle-même. L'utilisation de OAuth pour l'authentification est comme un gestionnaire d'appartement donnant à quelqu'un qui veut connaître votre identité une clé temporaire de votre appartement. La clé implique seulement un droit d'entrer dans l'appartement pour une durée spécifique. Cela ne signifie pas que l'individu est le propriétaire.

L'utilisation d'OpenID Connect complète l'image en fournissant aux applications des informations sur l'utilisateur, le contexte de son authentification et l'accès à ses informations de profil. OpenID Connect permet aux clients de tous types, y compris les clients Web, mobiles et JavaScript, de demander et de recevoir des informations sur les sessions authentifiées et les utilisateurs finaux. Pour plus d'informations, reportez-vous à OpenID Connect.

Deux concepts sont présentés :
  • Jeton d'ID OpenID Connect : ce jeton contient des informations sur la session authentifiée de l'utilisateur.

  • Adresse UserInfo : cette adresse permet au client d'extraire des attributs supplémentaires sur l'utilisateur.

Implémenter OpenID Connect

Trois actions principales sont requises pour implémenter OpenID Connect :

  1. Obtenir un jeton d'ID OpenID Connect : utilisez un type d'octroi OAuth2 pour demander un jeton d'ID OpenID Connect en incluant la portée openid dans la demande d'autorisation.

    Les cas d'emploi suivants fournissent des exemples de demandes et de réponses pour obtenir le jeton d'ID.

  2. Valider le jeton d'ID : validez le jeton d'ID pour vous assurer qu'il provient d'un émetteur sécurisé et que le contenu n'a pas été altéré pendant le transit.

    Le cas d'emploi suivant fournit des informations sur la méthode et les éléments à valider.

  3. Extraire les informations de profil à partir de l'adresse UserInfo : à l'aide du jeton d'accès OAuth2, accédez à l'adresse UserInfo pour extraire les informations de profil sur l'utilisateur authentifié.

    Le cas d'emploi suivant fournit des exemples de demandes et de réponses pour l'extraction des informations de profil à partir de l'adresse UserInfo.

Jeton d'identité

Un jeton d'identité est un jeton autonome sécurisé par l'intégrité (au format JWT (JSON Web Token)) défini dans la norme OpenID Connect contenant des réclamations concernant l'utilisateur final. Le jeton d'identité est l'extension principale qu'OpenID Connect applique à OAuth 2.0 pour activer l'authentification dans un domaine d'identité.

Le jeton d'identité JWT se compose de trois composants, un en-tête, une charge utile et la signature numérique. Conformément à la norme JWT, ces trois sections sont encodées Base64URL et séparées par des points.

Remarque

Les demandes OpenID Connect doivent contenir la valeur de portée openid.

OpenID Connect 1.0 est une couche d'identité simple au-dessus du protocole OAuth 2.0. Elle permet à une application client de domaine d'identité IAM (enregistrée en tant que client OAuth 2 avec un ID client et une clé secrète client) de vérifier l'identité de l'utilisateur final en fonction de l'authentification effectuée par un serveur d'autorisation (AS), et d'obtenir des informations de profil de base sur l'utilisateur final de manière interopérable et de type REST. OpenID Connect permet aux clients de tous types, y compris les clients Web, mobiles et JavaScript, de demander et de recevoir des informations sur les sessions authentifiées et les utilisateurs finaux. Pour plus d'informations, reportez-vous à OpenID Connect.

Nom Valeur
amr Références de méthodes d'authentification. Tableau JSON de chaînes qui sont des identificateurs pour les méthodes d'authentification utilisées dans l'authentification. Par exemple, les valeurs peuvent indiquer que les méthodes d'authentification par mot de passe et par mot de passe à usage unique ont été utilisées.
at_hash OAuth 2 Valeur de hachage de jeton d'accès.
aud Identifie les destinataires auxquels ce jeton d'ID est destiné. Doit être OAuth 2.0 client_id (en fonction de la spécification OpenID Connect). Il s'agit du nom du client OAuth (app.name) qui effectue la demande. Aud contient également l'émetteur de domaine d'identité IAM, transformant ainsi le type de jeton (IT) en une assertion utilisateur de domaine d'identité IAM.
authn_strength* Valeur renvoyée par l'authentification unique cloud indiquant la force d'authentification à partir du contexte AuthN.
auth_time Heure (heure UNIX) à laquelle Cloud SSO a réellement authentifié l'utilisateur (en secondes, en provenance du contexte AuthN).
azp Partie autorisée. Partie à laquelle le jeton d'ID a été émis. Le cas échéant, il DOIT contenir l'ID client OAuth 2.0 de cette partie. Cette réclamation n'est nécessaire que lorsque le jeton d'ID a une valeur d'audience unique et que cette audience est différente de la partie autorisée. Il peut être inclus même lorsque la partie autorisée est la même que le seul public. La valeur azp est une chaîne sensible à la casse qui contient une valeur StringOrURI.
exp Heure d'expiration (heure de la période UNIX) au cours de laquelle le jeton d'ID ne doit pas être accepté pour traitement. Cette valeur doit être identique à session_exp..
iat Heure (heure UNIX) de création du jeton JWT (en secondes). UNIX Epoch Time est un nombre JSON représentant le nombre de secondes entre 1970-01-01T0 :0:0Z, mesuré en temps universel coordonné (UTC) et la date/heure.
iss Principal ayant émis le jeton : https://<domainURL>
jti Identificateur unique généré par le serveur pour l'ID JWT.
nonce Valeur de chaîne utilisée pour associer une session client à un jeton d'ID et atténuer les attaques de réexécution. Cette valeur est fournie par Cloud Gate.
session_exp* Heure (heure UNIX) à laquelle la session SSO Cloud expire (secondes, doit être la même expiration de session SSO dans le contexte AuthN).
sid ID de session provenant de Cloud SSO (255 caractères ASCII maximum) à partir du contexte AuthN.
sub Identifie l'utilisateur. L'identificateur d'objet est localement unique, n'est jamais réaffecté et est destiné à être utilisé par le client : ID de connexion utilisateur (255 caractères ASCII maximum). Il s'agit de l'ID de connexion de l'utilisateur provenant du contexte AuthN.
sub_mappingattr* Attribut utilisé pour rechercher le sous-marin dans la banque d'ID.
tok_type* Identifie le type de jeton : IT
user_displayname* Nom d'affichage de l'utilisateur (255 caractères ASCII maximum) provenant du contexte AuthN.
user_csr* Indique (true) que l'utilisateur est un représentant du service client (CSR).
user_id* GUID de domaine d'identité IAM de l'utilisateur à partir du contexte AuthN.
user_lang* Langue préférée de l'utilisateur.
user_locale* Environnement local de l'utilisateur.
user_tenantname* Nom du locataire utilisateur (255 caractères ASCII maximum). Le GUID du locataire n'est spécifiquement pas enregistré dans le jeton
user_tz* Fuseau horaire de l'utilisateur.

Validation de jeton d'identité

Pourquoi valider les jetons ? Lorsque votre application Web vérifie les informations d'identification directement, elle vérifie que le nom utilisateur et le mot de passe présentés correspondent à ce que vous gérez. Lors de l'utilisation de l'identité basée sur les réclamations, vous confiez ce travail à un fournisseur d'identités.

La responsabilité passe de la vérification des informations d'identification brutes à la vérification que le demandeur a passé par votre fournisseur d'identités préféré et s'est authentifié avec succès. Le fournisseur d'identités représente une authentification réussie en émettant un jeton. Avant de pouvoir utiliser les informations ou d'en faire une assertion que l'utilisateur s'est authentifié, vous devez les valider.

OpenID Document de repérage

Le protocole OpenID Connect 1.0 est une couche d'identité simple au-dessus du protocole OAuth 2.0 qui nécessite l'utilisation de plusieurs adresses pour authentifier les utilisateurs et pour demander des ressources incluant des informations utilisateur, des jetons et des clés publiques. Pour vous aider à repérer les adresses que vous devez utiliser, OpenID Connect vous permet d'utiliser un document de découverte, qui est un document JSON trouvé à un emplacement bien connu. Ce document de repérage contient des paires clé/valeur qui fournissent des détails sur la configuration du fournisseur OpenID Connect, y compris les URI des adresses d'autorisation, de jeton, d'informations utilisateur et de clés publiques. Vous pouvez extraire le document de repérage pour le service OpenID Connect du domaine d'identité IAM à l'adresse suivante : https://<domainURL>/.well-known/openid-configuration.

Validation des jetons d'identité

Un jeton d'identité (ID) est un jeton autonome et sécurisé en matière d'intégrité (au format de jeton Web JSON) qui contient des déclarations sur l'utilisateur final. Il représente la session d'un utilisateur authentifié. Par conséquent, le jeton doit être validé pour qu'une application puisse faire confiance au contenu du jeton d'ID. Par exemple, si un attaquant malveillant a réexécuté le jeton d'ID d'un utilisateur qu'il avait capturé précédemment, l'application doit détecter que le jeton a été réexécuté ou utilisé après son expiration et refuser l'authentification.

Le jeton d'ID est défini dans la norme OpenID Connect et constitue l'extension principale qu'OpenID Connect applique à OAuth 2.0 pour activer l'authentification. Les jetons d'ID sont sensibles et peuvent être utilisés à mauvais escient s'ils sont interceptés. Assurez-vous que ces jetons sont gérés de manière sécurisée en les transmettant uniquement via HTTPS et uniquement à l'aide de données POST ou dans des en-têtes de demande. Si vous les stockez sur votre serveur, vous devez également les stocker en toute sécurité.
  1. Vérifiez que la valeur de la demande d'audience (aud) contient la valeur client_id de l'application. La demande aud (audience) peut contenir un tableau avec plusieurs éléments. Le jeton d'ID doit être rejeté si le jeton d'ID ne répertorie pas le client en tant qu'audience valide ou s'il contient des audiences supplémentaires qui ne sont pas sécurisées par le client.

  2. Vérifiez que l'heure en cours est antérieure à l'heure représentée par la demande d'heure d'expiration (exp).

  3. Vérifiez que le jeton d'ID est correctement signé par l'émetteur. Les jetons émis par le domaine d'identité sont signés à l'aide de l'un des certificats trouvés à l'URI indiqué dans le champ jwks_uri du document de repérage.
    • Extrayez le certificat public du locataire à partir de l'adresse SigningCert/jwk (par exemple, https://acme.identity.oraclecloud.com/admin/v1/SigningCert/jwk).

      Remarque

      Etant donné que les domaines d'identité changent rarement de clé publique, vous pouvez mettre en cache les clés publiques et, dans la plupart des cas, effectuer efficacement une validation locale. Cela nécessite de récupérer et d'analyser les certificats et d'effectuer les appels cryptographiques appropriés pour vérifier la signature :
    • Utilisez toutes les bibliothèques JWT disponibles pour valider, par exemple, la bibliothèque JWT Nimbus pour Java de Connect2id. Pour obtenir la liste des bibliothèques disponibles, reportez-vous à JWT.

      Remarque

      En cas d'échec de la validation de signature, afin d'éviter les réextractions constantes en cas d'attaques avec de faux jetons, la réextraction/remise en cache de la clé publique doit être basée sur un intervalle de temps, tel que 60 minutes, de sorte que les réextractions ne se produisent que toutes les 60 minutes.

    Exemple

    package sample;
     
    import java.net.MalformedURLException;
    import java.net.URL;
     
    import com.nimbusds.jose.JWSAlgorithm;
    import com.nimbusds.jose.jwk.source.JWKSource;
    import com.nimbusds.jose.jwk.source.RemoteJWKSet;
    import com.nimbusds.jose.proc.JWSKeySelector;
    import com.nimbusds.jose.proc.JWSVerificationKeySelector;
    import com.nimbusds.jose.proc.SecurityContext;
    import com.nimbusds.jwt.JWTClaimsSet;
    import com.nimbusds.jwt.proc.ConfigurableJWTProcessor;
    import com.nimbusds.jwt.proc.DefaultJWTProcessor;
     
    public class TokenValidation {
     
        public static void main(String[] args) {
            try {
                String tokenValue = "eyJ4NXQjUzI1....W9J4oQ";
         
                ConfigurableJWTProcessor jwtProcessor = new DefaultJWTProcessor();
     
                // change t
                JWKSource keySource = new RemoteJWKSet(new URL("https://<domainURL>/admin/v1/SigningCert/jwk"));
     
                // The expected JWS algorithm of the token (agreed out-of-band)
                JWSAlgorithm expectedJWSAlg = JWSAlgorithm.RS256;
     
                // Configure the JWT processor with a key selector to feed matching public
                // RSA keys sourced from the JWK set URL
                JWSKeySelector keySelector = new JWSVerificationKeySelector(expectedJWSAlg, keySource);
                jwtProcessor.setJWSKeySelector(keySelector);
     
                // Process the token
                SecurityContext ctx = null; // optional context parameter, not required here
                JWTClaimsSet claimsSet = jwtProcessor.process(tokenValue, ctx);
                // Print out the token claims set
                System.out.println(claimsSet.toJSONObject());
                 
     
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
    }
  4. Vérifiez que la valeur de la demande d'identificateur d'émetteur (iss) correspond exactement à la valeur de la demande iss (émetteur) : https://<domainURL>/

Interrogation de l'adresse UserInfo

L'adresse UserInfo OpenID Connect est utilisée par une application pour extraire des informations de profil sur l'identité qui s'est authentifiée. Les applications peuvent utiliser cette adresse pour extraire des informations de profil, des préférences et d'autres informations propres à l'utilisateur.

Le profil OpenID Connect comprend deux composants :

  • Déclarations décrivant l'utilisateur

  • Adresse UserInfo fournissant un mécanisme pour extraire ces demandes
    Remarque

    Les réclamations utilisateur peuvent également être présentées dans le jeton d'ID pour éliminer un rappel lors de l'authentification.

Profil utilisateur - Déclarations

L'adresse UserInfo fournit un ensemble de demandes en fonction des portées OAuth2 présentées dans la demande d'authentification. OpenID Connect définit cinq valeurs de portée qui correspondent à un ensemble spécifique de déclarations par défaut :

Portée OpenID Connect Déclarations retournées

openid

Aucun - Indique qu'il s'agit d'une demande OpenID Connect

profil

nom, family_name, given_name, middle_name, surnom, preferred_username, profil, image, site Web, sexe, date de naissance, zoneinfo, locale, updated_at

adresse

adresse

courriel

courriel, email_verified

téléphone

phone_number, phone_number_verified

Le client doit présenter ses informations d'identification et un jeton d'accès. Le jeton d'accès présenté doit contenir la portée openid.

Si une portée est omise (par exemple, la portée email n'est pas utilisée), la demande (email) ne sera pas présente dans les demandes renvoyées.

Exemple de demande d'adresse UserInfo

Une fois que l'application client a authentifié un utilisateur et dispose du jeton d'accès, le client peut demander à l'adresse UserInfo d'extraire les attributs demandés sur un utilisateur. L'exemple suivant présente un exemple de demande.

   curl -i
   -H 'Content-Type: application/x-www-form-urlencoded'
   -H 'Authorization: Bearer eyJ4NXQjUzI1....rtApFw'-H 'Accept: */*'
   -H 'Content_Language: en-US'--request GET https://<domainURL>/oauth2/v1/userinfo

Exemple de réponse

Une réponse réussie renvoie une réponse HTTP 200 OK et les déclarations de l'utilisateur au format JSON :

{
"birthdate":"",
"email":"user@example.com",
"email_verified":false,
"family_name":"user",
"gender":"",
"given_name":"user",
"appRoles":[],
"name":"alice alice",
"preferred_username":"user@example.com",
"sub":"user@example.com",
"updated_at":1495136783,"website":""
}

Pour que l'application client puisse faire confiance aux valeurs renvoyées par l'adresse UserInfo (par exemple, en tant que vérification de l'attaque de substitution de jeton), le client doit vérifier que la demande sub renvoyée par la demande d'adresse UserInfo correspond à l'objet du jeton d'ID.

Utiliser le flux de code d'autorisation avec OpenID Connect

Utilisez le flux Code d'autorisation lorsque vous avez des clients qui peuvent maintenir en toute sécurité une clé secrète client entre eux et le serveur d'autorisation. Le flux de code d'autorisation renvoie un code d'autorisation au client, qui peut ensuite échanger le code contre un jeton d'ID et un jeton d'accès directement.

Cela vous permet de ne pas exposer de jetons à l'agent utilisateur (tel qu'un navigateur Web) et éventuellement à d'autres applications malveillantes ayant accès à l'agent utilisateur. Le serveur d'autorisation peut également authentifier le client avant d'échanger le code d'autorisation contre un jeton d'accès. Le flux Code d'autorisation fonctionne à la fois avec les clients confidentiels et les clients publics.

Clients confidentiels

Le flux de code d'autorisation comporte deux étapes :
  1. Demandez le code d'autorisation. Dans cette demande, la valeur du paramètre de portée est openid. Il s'agit d'une valeur de spécification OpenID Connect.

    Exemple de demande

    https://<domainURL>/oauth2/v1/authorize?client_id=<client-id>&response_type=code&redirect_uri=<client-redirect-uri>&scope=openid

    Exemple de réponse

    https://<domainURL>/?code=AQIDBAXv9lZQ....F9NCA=
    • Vous pouvez fournir des valeurs de portée supplémentaires dans vos demandes, par exemple :

      https://<domainURL>/oauth2/v1/authorize?client_id=<client-id>&response_type=code&redirect_uri=<client-redirect-uri>&scope=phone+openid+offline_access+profile+address+email
      
    • Cette demande contient à la fois l'openid et une portée de ressource OAuth :

      https://<domainURL>/oauth2/v1/authorize?client_id=<client-id>&response_type=code&redirect_uri=<client-redirect-uri>&scope=http://<domainURL>/api+openid
  2. Demandez le jeton. Le client extrait le paramètre de code de la réponse et effectue la demande de jeton. En outre, le client fournit son ID client et sa clé secrète dans l'en-tête Authentification de base.

    Exemple de demande

       curl -i
       -H 'Authorization: Basic ZWE1OGIwNDA0N2ZkNGQ4MTgyYThiYWQ0ZTNkMGFmZjU6ZGMxNGE4MjMtZGU2OC00YWNhLTg1OWUtMWNhZTJmNjQ0NTBi' 
       -H 'Accept: */*'
       --request POST 'https://<domainURL>/oauth2/v1/token' -d 'grant_type=authorization_code&code=AQIDBAXv9lZQ???.jF9NCA'

    Exemple de réponse

    La demande contient à la fois le jeton d'accès et le jeton d'ID.

    {
    "access_token":"eyJ4NXQjUzI1???.xhtnbw",
    "token_type":"Bearer",
    "expires_in":27261,
    "id_token":"eyJ4NXQjUzI1???.._XLqUw"
    }

Clients publics

Les clients publics ne disposent pas d'informations d'identification, mais d'un identificateur client. Le flux de code d'autorisation comporte deux étapes. Les demandes impliquent une demande GET basée sur un navigateur, puis une demande POST de canal arrière pour obtenir le jeton d'accès.

  1. Demandez le code d'autorisation.

    Exemple de demande

    GET https://<domainURL>/oauth2/v1/authorize?client_id=<client-id>&response_type=code&redirect_uri=<client-redirect-uri>&scope=openid&nonce=<nonce-value>&state=1234

    Exemple de réponse

    Remarque

    Ces exemples de demande et de réponse sont similaires à ceux du client confidentiel et aux réponses abordées précédemment.
    https://<domainURL>/?code=AQIDBAXv9lZQ....F9NCA=
  2. Demandez le jeton.

    Exemple de demande

    Remarque

    Cette demande est différente de la demande Client confidentiel dans laquelle l'ID client et la clé secrète client sont spécifiés dans l'en-tête Authentification de base. Dans le flux client public, il n'y a pas d'en-tête d'authentification de base. L'ID client est spécifié dans la charge utile de la demande.
       curl -i
       -H 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'   
       --request POST https://<domainURL>/oauth2/v1/token 
       -d 'grant_type=authorization_code&code=<authz-code>&reidrect_uri=<client-redirect-uri>&client_id=<client-id>'

    Exemple de réponse

    {
    "access_token":"eyJ4NXQjUzI1???.xhtnbw",
    "token_type":"Bearer",
    "expires_in":27261,
    "id_token":"eyJ4NXQjUzI1???.._XLqUw"
    }
    

Utiliser le flux implicite avec OpenID Connect

Utilisez le flux implicite lorsque vous avez implémenté un client basé sur un navigateur à l'aide d'un langage de script tel que JavaScript. Le jeton d'accès et le jeton d'ID sont renvoyés directement au client, ce qui peut exposer ces jetons à l'utilisateur et aux applications qui ont accès à l'agent utilisateur de l'utilisateur (par exemple, un navigateur Web).

Aucune demande de jeton programmatique/back-canal n'est impliquée dans ce flux (comme la demande Public Client dans l'exemple de flux de code d'autorisation). Tous les jetons sont renvoyés à partir de l'adresse Authorization et l'adresse token n'est pas utilisée. Le flux implicite fonctionne avec des clients confidentiels, de confiance et publics.
Remarque

Les clients publics ne disposent pas d'informations d'identification, mais uniquement d'un identificateur client.

Les valeurs response_type suivantes sont prises en charge avec le flux implicite :

  • id_token (jeton d'ID)

  • token (jeton d'accès)

  • id_token token (le jeton d'ID et le jeton d'accès)

Obtention d'un jeton d'ID

Le flux implicite comporte trois étapes pour obtenir un jeton d'ID :
  1. Demandez le jeton.

    Exemple de demande

    https://<domainURL>/oauth2/v1/authorize?client_id=<client_id>&response_type=id_token&redirect_uri=<client_redirect_uri>&scope=address+openid+profile&nonce=abcdefg
  2. L'utilisateur se connecte et donne son consentement (en fonction des portées demandées)

  3. Réponse avec jeton d'ID

    Exemple de réponse

    Remarque

    Tous les paramètres de réponse sont ajoutés au composant de fragment de l'URI de redirection.
    https://<domainURL>/#id_token=eyJ4NXQjUzI1.....gF5uyQ

Obtention d'un jeton d'accès

Le flux implicite comporte trois étapes pour obtenir un jeton d'accès :

  1. Demandez le jeton d'accès.

    Exemple de demande

    https://<domainURL>/oauth2/v1/authorize?client_id=<client_id>&response_type=token&redirect_uri=<client_redirect_uri>&scope=address+openid+profile
  2. L'utilisateur se connecte et donne son consentement (en fonction des portées demandées).

  3. Réponse avec jeton d'accès

    Exemple de réponse

    Remarque

    Tous les paramètres de réponse sont ajoutés au composant de fragment de l'URI de redirection.
    https://<domainURL>/#access_token=eyJ4NXQjUzI1...4WGvJQ&token_type=Bearer&expires_in=3600

Obtention d'un jeton d'ID et d'un jeton d'accès

Le flux implicite comporte trois étapes pour obtenir à la fois le jeton d'ID et le jeton d'accès :
  1. Demandez le jeton d'ID et le jeton d'accès.

    Exemple de demande
    https://<domainURL>/oauth2/v1/authorize?client_id=<client_id>&response_type=id_token token&redirect_uri=<client_redirect_uri>&scope=address+openid+profile&nonce=abcdefghijkl
  2. L'utilisateur se connecte et donne son consentement (en fonction des portées demandées).

  3. Réponse avec le jeton d'accès et le jeton d'ID.

    Exemple de réponse
    Remarque

    Tous les paramètres de réponse sont ajoutés au composant de fragment de l'URI de redirection.
    https://<domainURL>/#access_token=eyJ4NXQjUzI....XWGmeQ&id_token=eyJ4NXQjUzI1....&token_type=Bearer&expires_in=3600

Utilisation du flux hybride avec OpenID Connect

Utilisez le flux hybride lorsque vous souhaitez obtenir des jetons séparément du canal avant et du canal arrière. Par exemple, vous disposez d'un composant de navigateur tel que JavaScript et d'un composant de serveur back-end tel que Node.js. Le composant de navigateur obtient le code d'autorisation et le jeton d'ID, puis peut personnaliser le contenu de l'interface utilisateur. Le composant back-end obtient le jeton d'accès pour effectuer des appels d'API métier.

Les clients doivent prendre en charge à la fois les demandes et les réponses basées sur un navigateur et les demandes et réponses programmatiques/back-canal pour utiliser le flux hybride. Le flux hybride fonctionne à la fois avec les clients confidentiels et les clients publics. Les valeurs response_type suivantes sont prises en charge avec le flux hybride :

  • code id_token (jeton d'ID)

  • code token (jeton d'accès)

  • code id_token token (code d'autorisation, jeton d'ID et jeton d'accès)

Obtention d'un jeton d'ID

Le flux hybride comporte quatre étapes pour obtenir à la fois le code d'autorisation et le jeton d'ID :
  1. Demandez le code d'autorisation et le jeton d'ID.

    Exemple de demande

    https://<domainURL>/oauth2/v1/authorize?client_id=<client_id>&response_type=code id_token&redirect_uri=<client_redirect_uri>&scope=http://<domainURL>/test+openid+offline_access&nonce=abcdefghijk
  2. L'utilisateur se connecte et donne son consentement (en fonction des portées demandées).

  3. Réponse avec le jeton d'ID et le code d'autorisation.

    Exemple de réponse

    Remarque

    Tous les paramètres de réponse sont ajoutés au composant de fragment de l'URI de redirection.
    https://<domainURL>/#code=AQIDBAUrAi0l....F9NCA=&id_token=eyJ4NXQjUzI1....3R8b_Q
  4. L'application client utilise le code d'autorisation et effectue une demande de canal arrière pour obtenir un nouveau jeton d'accès et des jetons d'actualisation.

    Exemple de demande

       curl -i
       -H 'Authorization: Basic YjA3NTZkNDc5M2QwNDZjNjhjZWVmY2UxZjE4ZGUwMWM6NGYzZjJjN2EtZTBjZC00NzcyLWE5MTYtNjI3ZmExNzA2NWE5'
       -H 'Accept: */*'
       --request POST 'https://<domainURL>/oauth2/v1/token' -d 'grant_type=authorization_code&code=AQIDBAUrAi0l???.CA%3D'
    

    Exemple de réponse

    {
    "access_token":"eyJ4NXQjUzI1....sJ5mCw",
    "token_type":"Bearer",
    "expires_in":3600,
    "refresh_token":"AQIDBAUwxxoC....tZLvA"
    }

Obtention d'un jeton d'accès

Le flux hybride comporte quatre étapes pour obtenir le code d'autorisation et le jeton d'accès :

  1. Demandez le code d'autorisation et le jeton d'accès.

    Exemple de demande

    https://<domainURL>/oauth2/v1/authorize?client_id=<client_id>&response_type=code token&redirect_uri=<client_redirect_uri>&scope=http://<domainURL>/test
  2. L'utilisateur se connecte et donne son consentement (en fonction des portées demandées).

  3. Réponse avec le jeton d'ID et le code d'autorisation.

    Exemple de réponse

    Remarque

    Tous les paramètres de réponse sont ajoutés au composant de fragment de l'URI de redirection.
    https://<domainURL>/#access_token=eyJ4NXQjUzI1....Pudw9A&code=AQIDBAU6d6Ae....F9NCA=&token_type=Bearer&expires_in=3600
  4. L'application client utilise le code d'autorisation et effectue une demande de canal arrière pour obtenir un nouveau jeton d'accès.

    Exemple de demande
       curl -i
      -H 'Authorization: Basic YjA3NTZkNDc5M2QwNDZjNjhjZWVmY2UxZjE4ZGUwMWM6NGYzZjJjN2EtZTBjZC00NzcyLWE5MTYtNjI3ZmExNzA2NWE5'
       -H 'Accept: */*''
       --request POST 'https://<domainURL>/oauth2/v1/token' -d 'grant_type=authorization_code&code=AQIDBAU6d6Ae...NCA%3D'

    Exemple de réponse

    {
    "access_token":"eyJ4NXQjUzI1....Tgs9LA",
    "token_type":"Bearer",
    "expires_in":3600
    }

Obtention d'un jeton d'ID et d'un jeton d'accès

Le flux hybride comporte quatre étapes pour obtenir le code d'autorisation, le jeton d'ID et le jeton d'accès :
  1. Demandez le code d'autorisation et le jeton d'ID.

    Exemple de demande
    https://<domainURL>/oauth2/v1/authorize?client_id=client_id&response_type=cod id_token token&redirect_uri=client_redirect_uri&scope=http://<domainURL>/test+openid&nonce=abcdaer
  2. L'utilisateur se connecte et donne son consentement (en fonction des portées demandées).

  3. Réponse avec le jeton d'ID et le jeton d'accès.

    Exemple de réponse
    Remarque

    Tous les paramètres de réponse sont ajoutés au composant de fragment de l'URI de redirection.
    https://<domainURL>/#access_token=eyJ4NXQjUzI1....sDB7lA&code=AQIDBAVxZzy-....F9NCA=&id_token=eyJ4NXQjUzI1....&token_type=Bearer&expires_in=36004
  4. L'application client utilise le code d'autorisation et effectue une demande de canal arrière pour obtenir un nouveau jeton d'accès.

    Exemple de demande
       curl -i
       -H 'Authorization: Basic YjA3NTZkNDc5M2QwNDZjNjhjZWVmY2UxZjE4ZGUwMWM6NGYzZjJjN2EtZTBjZC00NzcyLWE5MTYtNjI3ZmExNzA2NWE5'
       -H 'Accept: */*' ?request
       POST 'https://<domainURL>/oauth2/v1/token' -d 'grant_type=authorization_code&code=AQIDBAXUbLmS???.NCA%3D'

    Exemple de réponse

    {
    "access_token":"eyJ4NXQjUzI1....g52XmQ",
    "token_type":"Bearer",
    "expires_in":3600,
    "id_token":"eyJ4NXQjUzI1....f6JfWA"
    }

Utiliser OpenID Connect pour la déconnexion

Vous pouvez utiliser OpenID Connect pour les demandes de déconnexion basées sur un navigateur.

Vous pouvez demander une déconnexion à l'aide d'OpenID Connect de deux manières :

  1. Redirigez vers le client qui a lancé la déconnexion.

    Remarque

    Veillez à définir l'URI de réacheminement post-déconnexion pour l'application client OAuth et à envoyer le jeton d'ID dans la demande. Le jeton d'ID contient l'ID client. L'URL de post-déconnexion correspondante de cet ID client est extraite et validée.

    Exemple de demande

    https://<domainURL>/oauth2/v1/userlogout?post_logout_redirect_uri=http://clienthost:port/myapp/return&state=c3004d28&id_token_hint=<IDToken>
  2. Utilisez la page de destination du locataire.

    Remarque

    Cette opération utilise la page de destination du locataire définie dans les paramètres SSO du locataire.

    Exemple de demande

    https://<domainURL>/oauth2/v1/userlogout