Remarques :

Accéder aux ressources protégées dans ORDS à l'aide d'un jeton JWT émis par les domaines OCI IAM

Introduction

Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) utilise des domaines d'identité pour fournir des fonctionnalités de gestion des identités et des accès telles que l'authentification, l'accès avec connexion unique (SSO) et la gestion du cycle de vie des identités pour OCI, ainsi que pour les applications Oracle et non Oracle, qu'elles soient SaaS, hébergées dans le cloud ou sur site.

Oracle REST Data Services (ORDS) fait le lien entre HTTPS et Oracle Database. Application Java de niveau intermédiaire, ORDS fournit une API REST de gestion de base de données, SQL Developer Web, une passerelle PL/SQL, Simple Oracle Document Access (SODA) pour REST et la possibilité de publier des services Web RESTful pour interagir avec les données et les procédures stockées dans Oracle Database.

ORDS version 23.3 introduit la prise en charge du jeton Web JSON (JWT). Ces jetons porteurs permettent aux développeurs ORDS de déléguer l'authentification et l'autorisation à tout fournisseur d'identités compatible OAuth2 (IdP) afin d'émettre un jeton d'accès JWT qu'ORDS peut valider pour fournir l'accès aux ressources protégées ORDS.

Dans ce tutoriel, nous allons montrer comment accéder aux ressources protégées dans ORDS à l'aide d'un jeton JWT émis par des domaines OCI IAM. Pour cette démonstration, nous allons utiliser une base de données Oracle Autonomous Database dans OCI, qui est fournie avec une application ORDS préconfigurée et entièrement gérée.

L'image suivante présente la représentation de haut niveau de l'architecture de la solution.

Diagramme d'architecture

Objectifs

Prérequis

Remarque : le domaine OCI IAM et le jeton JWT émis par ce domaine répondent à toutes les exigences ci-dessus.

Tâche 1 : configurer ORDS pour un schéma de base de données, définir des adresses d'API et configurer le contrôle d'accès

  1. Connectez-vous à la console OCI, accédez à Oracle Database et cliquez sur Autonomous Database.

  2. Cliquez sur Instance Autonomous Database provisionnée, sur Database Actions, puis sur SQL.

  3. Exécutez la requête suivante pour vous assurer que vous disposez d'ORDS version 23.3 ou supérieure, qui prend en charge les JWT.

    SELECT * FROM ORDS_METADATA.ORDS_VERSION;
    

    Version d'ORDS

  4. Exécutez la requête suivante pour créer un utilisateur (ordstest) et affecter les privilèges nécessaires.

    CREATE USER ordstest IDENTIFIED BY "<Password>";
    GRANT CONNECT, RESOURCE TO ordstest;
    ALTER USER ordstest DEFAULT ROLE CONNECT, RESOURCE;
    
  5. Exécutez la requête suivante afin d'activer ORDS pour le schéma afin d'autoriser la fonctionnalité d'API REST.

    BEGIN
     ORDS_ADMIN.ENABLE_SCHEMA(
         p_enabled => TRUE,
         p_schema => 'ordstest',
         p_url_mapping_type => 'BASE_PATH',
         p_url_mapping_pattern => 'ordstest',
         p_auto_rest_auth=> FALSE
     );
    commit;
    END;
    /
    
  6. Exécutez la requête suivante pour créer une table nommée emp dans le schéma ordstest et insérer des exemples de données.

    CREATE TABLE ordstest.emp (
    EMPNO NUMBER(4,0),
    ENAME VARCHAR2(10 BYTE),
    JOB VARCHAR2(9 BYTE),
    MGR NUMBER(4,0),
    HIREDATE DATE,
    SAL NUMBER(7,2),
    COMM NUMBER(7,2),
    DEPTNO NUMBER(2,0),
    CONSTRAINT PK_EMP PRIMARY KEY (EMPNO)
    );
    
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30);
    
  7. Exécutez l'interrogation suivante pour définir un module ORDS (demo) qui contiendra les adresses d'API.

    BEGIN
      ORDS_ADMIN.DEFINE_MODULE(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_base_path => '/demo/',
         p_items_per_page=> 1000,
         p_status => 'PUBLISHED',
         p_comments=> ''
     );
    COMMIT;
    END;
    /
    
  8. Exécutez la requête suivante pour définir un modèle emp mis en correspondance avec une ressource REST spécifique.

    BEGIN
     ORDS_ADMIN.DEFINE_TEMPLATE(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_pattern => 'emp',
         p_priority => 0,
         p_etag_type => 'HASH',
         p_comments => ''
     );
    COMMIT;
    END;
    /
    
  9. Exécutez la requête suivante afin de créer un gestionnaire de demandes GET pour emp, qui exécute une requête SQL simple renvoyant des données de la table emp.

    BEGIN
     ORDS_ADMIN.DEFINE_HANDLER(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_pattern => 'emp',
         p_method => 'GET',
         p_source_type => ords.source_type_collection_feed,
         p_source => 'select * from emp',
         p_items_per_page => 25,
         p_comments => ''
     );
    COMMIT;
    END;
    /
    

    Vous pouvez afficher la table emp sans authentification en ajoutant /ordstest/demo/emp à l'URL d'accès public ORDS des bases de données autonomes Oracle, disponible sous Configuration d'outil. Postman est utilisé dans ce tutoriel.

    URL ORDS

    Accès sans autorisation

  10. Exécutez la requête suivante pour définir un privilège (privilegetest) afin de protéger le module demo.

    DECLARE
    L_PRIV_ROLES owa.vc_arr;
    L_PRIV_PATTERNS owa.vc_arr;
    L_PRIV_MODULES owa.vc_arr;
    BEGIN
    L_PRIV_MODULES( 1 ) := 'demo';
    ORDS_ADMIN.DEFINE_PRIVILEGE(
      P_Schema=> 'ordstest',
      P_PRIVILEGE_NAME => 'privilegetest',
      P_ROLES => L_PRIV_ROLES,
      P_PATTERNS =>  L_PRIV_PATTERNS,
      P_MODULES => L_PRIV_MODULES,
      P_LABEL => 'privilegetest',
      P_DESCRIPTION => 'Demonstrate controlling access with priviliges',
      P_COMMENTS=> ''
      );
    COMMIT;
    END;
    /
    

    Etant donné que le module demo est protégé par le privilège privilegetest, il est impossible d'y accéder sans autorisation appropriée. Pour activer l'accès, vous devez créer un profil JWT pour le schéma ordstest. Cela permet à ORDS de valider les jetons porteurs JWT et d'accorder l'accès aux ressources protégées, telles que le module de démonstration.

Tâche 2 : créer un profil JWT ORDS

Un profil JWT peut être créé dans un schéma compatible REST à l'aide de la procédure OAUTH.CREATE_JWT_PROFILE. Cependant, un seul profil JWT peut être défini par schéma. Pour mettre à jour un profil JWT existant, vous devez d'abord le supprimer avant d'en créer un nouveau.

BEGIN
  OAUTH_ADMIN.DELETE_JWT_PROFILE(p_schema=>'ordstest');
  OAUTH_ADMIN.CREATE_JWT_PROFILE(
  p_schema => 'ordstest',
  p_issuer => 'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com',
  p_audience => 'ords/ordstest/',
  p_jwk_url =>'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com:443/admin/v1/SigningCert/jwk'
 );
COMMIT;
END;
/

Ce profil JWT spécifie l'émetteur, le public et l'URL JWK.

Vous pouvez obtenir Issuer et JWK URI pour un domaine OCI IAM en envoyant une demande GET à l'URL de domaine OCI IAM, en ajoutant /.well-known/openid-configuration, comme indiqué dans l'image suivante.

Métadonnées de domaine IAM

Pour vérifier la configuration du profil JWT, connectez-vous en tant qu'utilisateur ordstest et exécutez la requête SQL suivante.

SELECT * FROM ORDS_METADATA.USER_ORDS_JWT_PROFILE;

Cette requête extrait les détails du profil JWT et vérifie que l'émetteur, l'audience et l'URL JWK sont correctement configurés.

Profil JWT ORDS

Une fois le profil JWT configuré, les utilisateurs finaux peuvent accéder aux ressources protégées ORDS en présentant des jetons JWT émis par un élément IdP compatible OAuth 2.0, tel que le domaine OCI IAM indiqué dans le profil JWT. Lorsqu'un jeton porteur JWT est validé avec succès, ORDS accepte les éléments suivants :

Tâche 3 : activation de l'accès ORDS au certificat de signature de domaine OCI IAM sans authentification

  1. Accédez à la console OCI, accédez à Identité et sécurité, à Identité et cliquez sur Domaines.

  2. Cliquez sur le nom du domaine d'identité dans lequel vous voulez travailler. Il est possible que vous deviez changer de compartiment pour trouver le domaine souhaité. Cliquez sur Paramètres et Paramètres de domaine.

  3. Dans la section Accès au certificat de signature, sélectionnez Configurer l'accès client et cliquez sur Enregistrer les modifications. ORDS peut ainsi accéder à la certification de signature pour le domaine d'identité sans authentification.

    Certificat de signature

Tâche 4 : configurer le serveur de ressources et le client, les portées JWT et les privilèges ORDS

Vous devez configurer IdP pour émettre le jeton JWT avec une portée qui correspond au privilège ORDS requis. Si une ressource dans ORDS est protégée par un privilège, ce nom de privilège doit être défini en tant que portée. Cette portée permet à l'application de demander l'accès au nom de l'utilisateur. Le JWT émis doit alors inclure la portée en tant que réclamation. Etant donné que nous allons utiliser les services OCI IAM OAuth2 pour appliquer l'autorisation, nous devons configurer certains clients et serveurs de ressources.

Tâche 4.1 : Créer une application confidentielle de type Serveur de ressources avec le public et les portées souhaités

  1. Accédez au domaine d'identité dans lequel vous travaillez et cliquez sur Applications intégrées.

  2. Sélectionnez Ajouter une application, Application confidentielle et cliquez sur Lancer le workflow.

  3. Entrez le nom de l'application (par exemple, ORDS-SERVER), puis cliquez sur Suivant.

  4. Dans la section Configuration du serveur de ressource, sélectionnez Configurer cette application comme serveur de ressource maintenant.

  5. Configurez le serveur de ressources avec une audience principale correspondant au profil JWT et une étendue correspondant au privilège ORDS.

    Configuration du serveur de ressource

  6. Cliquez sur Suivant et Terminer.

  7. Sur la page de présentation de l'application, sélectionnez Activer et confirmez l'activation de l'application. L'application confidentielle est activée.

Tâche 4.2 : créer une application confidentielle de type Client à laquelle sont affectées les portées souhaitées

  1. Accédez au domaine d'identité dans lequel vous travaillez et cliquez sur Applications intégrées.

  2. Sélectionnez Ajouter une application, Application confidentielle et cliquez sur Lancer le workflow.

  3. Entrez le nom de l'application (par exemple, ORDS-CLIENT), puis cliquez sur Suivant.

  4. Dans la section Configuration du client, sélectionnez Configurer cette application comme client maintenant.

  5. Dans la section Autorisation, sélectionnez Informations d'identification client.

    Remarque : dans ce tutoriel, nous utilisons les informations d'identification client en tant que types d'octroi. Vous pouvez sélectionner un autre type d'octroi en fonction de vos besoins, par exemple Flux de code d'autorisation pour un client orienté utilisateur.

  6. Dans Type de client, sélectionnez Confidentiel.

  7. Dans la section Stratégie d'émission de jeton, sélectionnez Spécifique en tant que Ressources autorisées.

  8. Cliquez sur Ajouter des ressources et, sous Ressources, sélectionnez Ajouter une portée. Sélectionnez les portées souhaitées pour le serveur de ressources créé dans la tâche 4.1. Par exemple, privilegetest.

    Configuration du client

  9. Cliquez sur Suivant et Terminer.

  10. Sur la page Présentation de l'application, sélectionnez Activer et confirmez l'activation de l'application. L'application confidentielle est activée.

  11. Copiez l'ID client et la clé secrète client de cette application client. Ces informations d'identification seront obligatoires pour l'authentification.

Tâche 5 : envoyer des demandes à ORDS à l'aide d'un jeton de support JWT

Envoyez une demande de publication (à l'aide de Postman) à l'adresse de jeton de domaine OCI IAM avec le type d'octroi client_credentials et la portée privilegetest, comme indiqué dans l'image suivante.

Point de terminaison du jeton

Remarque : l'audience et la portée doivent être incluses dans le champ de portée lors de la demande du jeton de support à partir du domaine OCI IAM.

Informations d'identification client

Validez le jeton JWT pour les portées, l'émetteur et l'audience.

Détails du jeton JWT

Vous pouvez désormais accéder à la ressource ORDS protégée (module de démonstration) dans le schéma ordstest en fournissant un jeton de support JWT valide avec la demande get, comme illustré dans l'image suivante.

Accès avec JWT

ORDS valide le jeton en extrayant la clé publique de l'URL JWK et en vérifiant la signature du jeton. Si la signature est valide, ORDS vérifie si les demandes iss (émetteur) et aud (audience) correspondent à celles définies dans le profil JWT. Il vérifie également que la demande de portée correspond au privilège protégeant la ressource. Si toutes les conditions sont remplies, l'utilisateur est autorisé à accéder à la ressource protégée.

Remerciements

Ressources de formation supplémentaires

Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à d'autres contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir la documentation produit, consultez le site Oracle Help Center.