Note :
- Ce tutoriel nécessite l'accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, voir Démarrer avec le niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeurs pour les données d'identification, la location et les compartiments d'Oracle Cloud Infrastructure. À la fin de votre laboratoire, remplacez ces valeurs par celles qui sont propres à votre environnement en nuage.
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.
Objectifs
- Accédez aux ressources protégées dans ORDS à l'aide d'un jeton JWT émis par les domaines OCI IAM.
Préalables
-
Les utilisateurs d'OCI doivent disposer des politiques nécessaires pour gérer les bases de données autonomes Oracle et les domaines OCI IAM. Pour plus d'informations sur les références aux politiques de tous les services, voir Informations de référence sur les politiques.
-
Une base de données Oracle Autonomous Database doit être disponible. Pour plus d'informations, voir Provisionner une instance Autonomous Database.
-
Avant que ORDS puisse accepter l'authentification et l'autorisation à l'aide de JWT :
-
Une instance IdP conforme à la norme OAuth2 (par exemple, OCI IAM with Identity Domains, Auth0) doit déjà avoir été configurée pour émettre des jetons JWT pour les utilisateurs autorisés à accéder aux ressources ORDS.
-
Si vous voulez utiliser des revendications personnalisées dans les politiques d'autorisation, IdP doit être configuré pour ajouter les revendications 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 l'émetteur IdP :
-
L'algorithme de signature doit être
RS256
,RS384
ouRS512
. -
La clé de vérification publique doit être d'au moins 2048 bits et ne doit pas dépasser 4096 bits.
-
La clé de vérification publique doit être spécifiée dans le format JWK (JSON Web Key) et accessible par ORDS sans authentification.
-
-
Exigences relatives aux URI JWK :
-
L'URI JWK doit être accessible à partir d'ORDS.
-
Les paramètres clés doivent être présents dans le JWKS pour vérifier la signature JWT.
-
Par défaut, la taille du JWKS peut atteindre 10 000 octets.
-
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
-
Connectez-vous à la console OCI, naviguez jusqu'à Oracle Database et cliquez sur Autonomous Database.
-
Cliquez sur Instance Autonomous Database provisionnée, Database Actions, puis sur SQL.
-
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;
-
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;
-
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; /
-
Exécutez l'interrogation suivante pour créer une table nommée
emp
dans le schémaordstest
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);
-
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; /
-
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; /
-
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 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; /
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. -
Exécutez l'interrogation 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; /
Comme le module
demo
est protégé par le privilègeprivilegetest
, il n'est pas accessible 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 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.
- La valeur
p_issuer
doit être non nulle et doit correspondre à la revendicationiss
dans le jeton du porteur JWT. - La valeur
p_audience
doit être non nulle et doit correspondre à la revendicationaud
dans le jeton du porteur JWT. - La valeur
p_jwk_url
doit être non nulle et commencer parhttps://
et identifier la clé de vérification publique fournie par le serveur d'autorisations dans un format JWK (JSON Web Key).
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.
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.
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 :
-
Réclamation d'objet JWT en tant qu'utilisateur authentifié effectuant la demande.
-
La portée JWT revendique les privilèges ORDS des schémas activés pour REST que l'utilisateur a consenti à l'application à l'aide des privilèges en son nom.
Tâche 3 : Activer l'accès ORDS au certificat de signature de domaine OCI IAM sans authentification
-
Allez à la console OCI, naviguez jusqu'à Identité et sécurité, Identité et cliquez sur Domaines.
-
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.
-
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.
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
-
Allez 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 flux de travail.
-
Entrez un nom pour l'application (par exemple,
ORDS-SERVER
) et cliquez sur Suivant. -
Dans la section Configuration du serveur de ressources, sélectionnez Configurer cette application comme serveur de ressources maintenant.
-
Configurez le serveur de ressources avec un audience principale correspondant au profil JWT et une portée correspondant au privilège ORDS.
-
Cliquez sur Suivant et Terminer.
-
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
-
Allez 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 flux de travail.
-
Entrez un nom pour l'application (par exemple,
ORDS-CLIENT
) et cliquez sur Suivant. -
Dans la section Configuration du client, sélectionnez Configurer cette application comme client maintenant.
-
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.
-
Dans Type de client, sélectionnez Confidentiel.
-
Dans la section Politique d'émission de jetons, sélectionnez Spécifique comme ressources autorisées.
-
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
. -
Cliquez sur Suivant et Terminer.
-
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.
-
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.
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.
Validez le jeton JWT pour les portées, l'émetteur et le public.
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.
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.
Liens connexes
Remerciements
- Auteur - Chaitanya Chintala (service de conseils sur la sécurité en nuage)
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.
Access Protected Resources in ORDS using a JWT Token Issued by OCI IAM Domains
G28847-01
Copyright ©2025, Oracle and/or its affiliates.