Note :

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

Présentation

Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) uses identity domains to provide identity and access management features such as authentication, Single Sign-On (SSO), and identity lifecycle management for OCI as well as for Oracle and non-Oracle applications, whether SaaS, cloud hosted, or on-premises.

Oracle REST Data Services (ORDS) relie HTTPS et Oracle Database. Application Java de niveau intermédiaire, ORDS fournit une API REST de gestion de bases de données, SQL Developer Web, une passerelle PL/SQL, un accès simple aux documents Oracle (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 de support permettent aux développeurs ORDS de déléguer l'authentification et l'autorisation à tout fournisseur d'identités conforme à OAuth2 (IdP) pour émettre un jeton d'accès JWT que ORDS peut valider afin de fournir l'accès aux ressources protégées ORDS.

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

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

Diagramme d'architecture

Objectifs

Préalables

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

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

  1. Connectez-vous à la console OCI, naviguez jusqu'à Oracle Database et cliquez sur Autonomous Database.

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

  3. Exécutez l'interrogation 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 ORDS

  4. Exécutez l'interrogation 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 l'interrogation suivante pour 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 l'interrogation suivante pour créer une table nommée emp dans le schéma ordstest et insérer des données-échantillons.

    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 points d'extrémité 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 l'interrogation suivante pour définir un modèle emp mappé à 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 l'interrogation suivante pour créer un programme de traitement de demandes GET pour emp, qui exécute une interrogation SQL simple retournant des données à partir 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;
    /
    

    La table emp peut être consultée sans aucune authentification en ajoutant /ordstest/demo/emp à l'URL d'accès public ORDS des bases de données autonomes Oracle, disponible sous Configuration d'outils. Postman est utilisé dans ce tutoriel.

    URL ORDS

    Accès sans autorisation

  10. Exécutez l'interrogation 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;
    /
    

    Comme le module demo est protégé par le privilège privilegetest, il n'est pas accessible 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 activé pour REST à l'aide de la procédure OAUTH.CREATE_JWT_PROFILE. Toutefois, 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, l'audience et l'URL JWK.

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

Métadonnées du domaine IAM

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

SELECT * FROM ORDS_METADATA.USER_ORDS_JWT_PROFILE;

Cette interrogation extrait les détails du profil JWT, en s'assurant 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 par ORDS en présentant des jetons JWT émis par un IdP conforme à OAuth 2.0, tels que le domaine OCI IAM spécifié dans le profil JWT. Lorsqu'un jeton porteur JWT est validé avec succès, ORDS accepte les éléments suivants :

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

  1. Allez à la console OCI, naviguez jusqu'à Identité et sécurité, Identité et cliquez sur Domaines.

  2. Cliquez sur le nom du domaine d'identité dans lequel vous voulez travailler. Vous devrez peut-être modifier le compartiment pour trouver le domaine souhaité. Cliquez sur Paramètres et sur Paramètres de domaine.

  3. Dans la section Accéder 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 étendues JWT et les privilèges ORDS

Vous devez configurer IdP pour émettre le jeton JWT avec une portée correspondant 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 étendue 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. Comme nous utiliserons les services OCI IAM OAuth2 pour appliquer l'autorisation, nous devons configurer certains serveurs de ressources et clients.

Tâche 4.1 : Créer une application confidentielle de type serveur de ressources avec l'audience et les portées souhaitées

  1. Allez 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 flux de travail.

  3. Entrez un nom pour l'application (par exemple, ORDS-SERVER) et cliquez sur Suivant.

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

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

    Configuration du serveur de ressources

  6. Cliquez sur Suivant et Terminer.

  7. Dans la page d'aperçu de l'application, sélectionnez Activer et confirmez que vous voulez activer 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. Allez 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 flux de travail.

  3. Entrez un nom pour l'application (par exemple, ORDS-CLIENT) et 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 Données d'identification du client.

    Note : Dans ce tutoriel, nous utilisons les données d'identification du client comme types d'octroi. Vous pouvez sélectionner un autre type d'autorisation 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 Politique d'émission de jetons, sélectionnez Spécifique comme ressources autorisées.

  8. Cliquez sur Ajouter des ressources et, sous Ressources, sélectionnez Ajouter une portée. Sélectionnez les étendues 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. Dans la page Aperçu de l'application, sélectionnez Activer et confirmez que vous voulez activer l'application. L'application confidentielle est activée.

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

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

Envoyez une demande de publication (à l'aide de Postman) au point d'extrémité du jeton de domaine OCI IAM avec Type d'octroi comme client_credentials et Portée comme privilegetest, comme illustré dans l'image suivante.

Point d'extrémité du jeton

Note : Le public et la portée doivent être inclus dans le champ de portée lors de la demande du jeton au porteur à partir du domaine OCI IAM.

Données d'identification du client

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

Détails du jeton JWT

Désormais, la ressource ORDS protégée (module de démonstration) du schéma ordstest est accessible en fournissant un jeton porteur JWT valide avec la demande d'obtention, 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 revendications iss (émetteur) et aud (audience) correspondent à celles définies dans le profil JWT. Il vérifie également que la revendication de portée correspond au privilège protégeant la ressource. Si toutes les conditions sont remplies, l'utilisateur a accès à la ressource protégée.

Remerciements

Autres ressources d'apprentissage

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

Pour obtenir la documentation sur le produit, visitez Oracle Help Center.