Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction à Oracle Cloud Infrastructure Free Tier.
- Il utilise des exemples de valeurs pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. Lorsque vous terminez votre atelier, remplacez ces valeurs par celles propres à votre environnement cloud.
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.
Objectifs
- Accédez aux ressources protégées dans ORDS à l'aide d'un jeton JWT émis par des domaines OCI IAM.
Prérequis
-
Les utilisateurs d'OCI doivent disposer des stratégies nécessaires pour gérer les bases de données autonomes Oracle et les domaines OCI IAM. Pour plus d'informations sur la référence de stratégie de tous les services, reportez-vous à Référence de stratégie.
-
Une base de données Oracle Autonomous Database doit être disponible. Pour plus d'informations, reportez-vous à Provisionnement d'une instance Autonomous Database.
-
Pour qu'ORDS puisse accepter l'authentification et l'autorisation à l'aide de JWT, procédez comme suit :
-
Une instance IdP conforme à OAuth2 (par exemple, OCI IAM avec des domaines d'identité, Auth0) doit avoir déjà été configurée afin d'émettre des jetons JWT pour les utilisateurs autorisés à accéder aux ressources ORDS.
-
Si vous voulez utiliser des demandes personnalisées dans les stratégies d'autorisation, IdP doit être configuré de façon à ajouter ces demandes personnalisées aux jetons JWT qu'il émet.
-
-
Pour valider un jeton JWT à l'aide d'une clé de vérification publique correspondante fournie par IdP, procédez comme suit :
-
L'algorithme de signature doit être
RS256
,RS384
ouRS512
. -
La clé de vérification publique doit comporter au moins 2048 bits et 4096 bits.
-
La clé de vérification publique doit être indiquée au format JWK (JSON Web Key) et accessible par ORDS sans authentification.
-
-
Exigences d'URI JWK :
-
L'URI JWK doit être accessible à partir d'ORDS.
-
Les paramètres de clé doivent être présents dans JWKS pour vérifier la signature JWT.
-
Par défaut, la taille de JWKS peut atteindre 10 000 octets.
-
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
-
Connectez-vous à la console OCI, accédez à Oracle Database et cliquez sur Autonomous Database.
-
Cliquez sur Instance Autonomous Database provisionnée, sur Database Actions, puis sur SQL.
-
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;
-
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;
-
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; /
-
Exécutez la requête suivante pour créer une table nommée
emp
dans le schémaordstest
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);
-
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; /
-
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; /
-
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 tableemp
.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. -
Exécutez la requête suivante pour définir un privilège (
privilegetest
) afin de protéger le moduledemo
.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ègeprivilegetest
, 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émaordstest
. 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.
p_issuer
doit être une valeur non NULL et doit correspondre à la demandeiss
dans le jeton de porteur JWT.p_audience
doit être une valeur non NULL et doit correspondre à la demandeaud
dans le jeton de porteur JWT.p_jwk_url
doit être une valeur non NULL commençant parhttps://
et identifier la clé de vérification publique fournie par le serveur d'autorisation au format de clé Web JSON (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.
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.
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 :
-
Réclamation d'objet JWT en tant qu'utilisateur authentifié qui effectue la demande.
-
La portée JWT revendique les privilèges ORDS des schémas compatibles REST que l'utilisateur a accordés à l'application en utilisant les privilèges en son nom.
Tâche 3 : activation de l'accès ORDS au certificat de signature de domaine OCI IAM sans authentification
-
Accédez à la console OCI, accédez à Identité et sécurité, à Identité et cliquez sur Domaines.
-
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.
-
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.
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
-
Accédez au domaine d'identité dans lequel vous travaillez et cliquez sur Applications intégrées.
-
Sélectionnez Ajouter une application, Application confidentielle et cliquez sur Lancer le workflow.
-
Entrez le nom de l'application (par exemple,
ORDS-SERVER
), puis cliquez sur Suivant. -
Dans la section Configuration du serveur de ressource, sélectionnez Configurer cette application comme serveur de ressource maintenant.
-
Configurez le serveur de ressources avec une audience principale correspondant au profil JWT et une étendue correspondant au privilège ORDS.
-
Cliquez sur Suivant et Terminer.
-
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
-
Accédez au domaine d'identité dans lequel vous travaillez et cliquez sur Applications intégrées.
-
Sélectionnez Ajouter une application, Application confidentielle et cliquez sur Lancer le workflow.
-
Entrez le nom de l'application (par exemple,
ORDS-CLIENT
), puis cliquez sur Suivant. -
Dans la section Configuration du client, sélectionnez Configurer cette application comme client maintenant.
-
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.
-
Dans Type de client, sélectionnez Confidentiel.
-
Dans la section Stratégie d'émission de jeton, sélectionnez Spécifique en tant que Ressources autorisées.
-
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
. -
Cliquez sur Suivant et Terminer.
-
Sur la page Présentation de l'application, sélectionnez Activer et confirmez l'activation de l'application. L'application confidentielle est activée.
-
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.
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.
Validez le jeton JWT pour les portées, l'émetteur et l'audience.
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.
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.
Liens connexes
Remerciements
- Auteur : Chaitanya Chintala (conseiller en sécurité cloud)
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.
Access Protected Resources in ORDS using a JWT Token Issued by OCI IAM Domains
G28848-01
Copyright ©2025, Oracle and/or its affiliates.