Note:

Acceso a recursos protegidos en ORDS mediante un token de JWT emitido por dominios de OCI IAM

Introducción

Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) utiliza dominios de identidad para proporcionar funciones de gestión de identidad y acceso como autenticación, conexión única (SSO) y gestión del ciclo de vida de identidad para OCI, así como para aplicaciones de Oracle y no de Oracle, ya sean SaaS, alojadas en la nube o locales.

Oracle REST Data Services (ORDS) conecta HTTPS y Oracle Database. ORDS, una aplicación Java de nivel medio, proporciona una API REST de Database Management, SQL Developer Web, un gateway PL/SQL, acceso simple a documentos de Oracle (SODA) para REST y la capacidad de publicar servicios web RESTful para interactuar con los datos y los procedimientos almacenados en Oracle Database.

La versión 23.3 de ORDS presenta el soporte para JSON Web Token (JWT). Estos tokens portadores permiten a los desarrolladores de ORDS delegar autenticación y autorización a cualquier proveedor de identidad compatible con OAuth2 (IdP) para emitir un token de acceso de JWT que ORDS puede validar para proporcionar acceso a los recursos protegidos de ORDS.

En este tutorial, mostraremos cómo acceder a los recursos protegidos de ORDS mediante un token de JWT emitido por dominios de OCI IAM. Para esta demostración, utilizaremos Oracle Autonomous Database en OCI, que incluye una aplicación ORDS preconfigurada y totalmente gestionada.

En la siguiente imagen se muestra la representación de alto nivel de la arquitectura de la solución.

Diagrama de arquitectura

Objetivos

Requisitos

Nota: El dominio de OCI IAM y el token de JWT que emite cumplen todos los requisitos anteriores.

Tarea 1: Configuración de ORDS para un esquema de base de datos, definición de puntos finales de API y configuración de control de acceso

  1. Conéctese a la consola de OCI, vaya a Oracle Database y haga clic en Autonomous Database.

  2. Haga clic en Instancia de Autonomous Database aprovisionada, Database Actions y, a continuación, haga clic en SQL.

  3. Ejecute la siguiente consulta para asegurarse de que tiene la versión 23.3 o superior de ORDS, que soporta JWT.

    SELECT * FROM ORDS_METADATA.ORDS_VERSION;
    

    Versión de ORDS

  4. Ejecute la siguiente consulta para crear un usuario (ordstest) y asignar los privilegios necesarios.

    CREATE USER ordstest IDENTIFIED BY "<Password>";
    GRANT CONNECT, RESOURCE TO ordstest;
    ALTER USER ordstest DEFAULT ROLE CONNECT, RESOURCE;
    
  5. Ejecute la siguiente consulta para activar ORDS para que el esquema permita la funcionalidad de la API de 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. Ejecute la siguiente consulta para crear una tabla denominada emp en el esquema ordstest e inserte datos de ejemplo.

    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. Ejecute la siguiente consulta para definir un módulo ORDS (demo) que contendrá los puntos finales de 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. Ejecute la siguiente consulta para definir una plantilla emp que se asigne a un recurso REST específico.

    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. Ejecute la siguiente consulta para crear un manejador de solicitudes GET para emp, que ejecuta una consulta SQL simple que devuelve datos de la tabla 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 tabla emp se puede ver sin ninguna autenticación agregando /ordstest/demo/emp a la URL de acceso público de ORDS de las bases de datos autónomas de Oracle, que está disponible en Configuración de herramientas. Postman se utiliza en este tutorial.

    URL DE ORDS

    Acceso sin autorización

  10. Ejecute la siguiente consulta para definir un privilegio (privilegetest) para proteger el módulo 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;
    /
    

    Dado que el módulo demo está protegido por el privilegio privilegetest, no se puede acceder a él sin la autorización adecuada. Para activar el acceso, debe crear un perfil de JWT para el esquema ordstest. Esto permite a ORDS validar tokens de portador de JWT y otorgar acceso a recursos protegidos, como el módulo de demostración.

Tarea 2: Creación de un perfil de JWT de ORDS

Se puede crear un perfil de JWT dentro de un esquema activado para REST mediante el procedimiento OAUTH.CREATE_JWT_PROFILE. Sin embargo, solo se puede definir un perfil de JWT por esquema. Para actualizar un perfil de JWT existente, primero se debe suprimir antes de crear uno nuevo.

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;
/

Este perfil de JWT especifica el emisor, el público y la URL de JWK.

Issuer y JWK URI para un dominio de OCI IAM se pueden obtener enviando una solicitud GET a la URL del dominio de OCI IAM, agregando /.well-known/openid-configuration, como se muestra en la siguiente imagen.

Metadatos de dominio de IAM

Para verificar la configuración del perfil de JWT, conéctese como usuario ordstest y ejecute la siguiente consulta SQL.

SELECT * FROM ORDS_METADATA.USER_ORDS_JWT_PROFILE;

Esta consulta recupera los detalles del perfil de JWT, lo que garantiza que el emisor, el público y la URL de JWK estén configurados correctamente.

Perfil de JWT de ORDS

Una vez configurado el perfil de JWT, los usuarios finales pueden acceder a los recursos protegidos de ORDS presentando tokens de JWT emitidos por un IdP compatible con OAuth 2.0, como el dominio de OCI IAM especificado en el perfil de JWT. Cuando un token de portador de JWT se valida correctamente, ORDS acepta lo siguiente:

Tarea 3: Activación del acceso de ORDS al certificado de firma de dominio de OCI IAM sin autenticación

  1. Vaya a la consola de OCI, vaya a Identidad y seguridad, Identidad y haga clic en Dominios.

  2. Haga clic en el nombre del dominio de identidad en el que desea trabajar. Puede que necesite cambiar el compartimento para buscar el dominio que desee. Haga clic en Configuración y Configuración de dominio.

  3. En la sección Certificado de firma de acceso, seleccione Configurar acceso de cliente y haga clic en Guardar cambios. Esto permite a ORDS acceder a la certificación de firma para el dominio de identidad sin autenticación.

    Certificado de firma

Tarea 4: Configurar el servidor de recursos y el cliente, los ámbitos de JWT y los privilegios de ORDS

Debe configurar IdP para que emita el JWT con un ámbito que coincida con el privilegio ORDS necesario. Si un recurso de ORDS está protegido por un privilegio, ese nombre de privilegio se debe definir como un ámbito. Este ámbito permite a la aplicación solicitar acceso en nombre del usuario. A continuación, el JWT emitido debe incluir el ámbito como reclamación. Dado que utilizaremos los servicios OAuth2 de OCI IAM para aplicar la autorización, debemos configurar algunos servidores de recursos y clientes.

Tarea 4.1: Creación de una aplicación confidencial de tipo Servidor de recursos con el público y los ámbitos deseados

  1. Vaya al dominio de identidad en el que está trabajando y haga clic en Aplicaciones integradas.

  2. Seleccione Agregar aplicación, Aplicación confidencial y haga clic en Iniciar flujo de trabajo.

  3. Introduzca un nombre para la aplicación (por ejemplo, ORDS-SERVER) y haga clic en Siguiente.

  4. En la sección Configuración del servidor de recursos, seleccione Configurar esta aplicación como un servidor de recursos ahora.

  5. Configure el servidor de recursos con audiencia principal que coincida con el perfil de JWT y ámbito que coincida con el privilegio ORDS.

    Configuración de servidor de recurso

  6. Haga clic en Siguiente y en Terminar.

  7. En la página de visión general de la aplicación, seleccione Activar y confirme que desea activar la aplicación. La aplicación confidencial está activada.

Tarea 4.2: Creación de una aplicación confidencial de tipo Cliente a la que se asignan los ámbitos deseados

  1. Vaya al dominio de identidad en el que está trabajando y haga clic en Aplicaciones integradas.

  2. Seleccione Agregar aplicación, Aplicación confidencial y haga clic en Iniciar flujo de trabajo.

  3. Introduzca un nombre para la aplicación (por ejemplo, ORDS-CLIENT) y haga clic en Siguiente.

  4. En la sección Configuración del cliente, seleccione Configurar esta aplicación como un cliente ahora.

  5. En la sección Authorization, seleccione Client credentials.

    Nota: En este tutorial, estamos utilizando Credenciales de Cliente como Tipos de Otorgamiento. Puede seleccionar un tipo de permiso diferente según sus requisitos, como Flujo de Código de Autorización para un cliente orientado al usuario.

  6. En Tipo de cliente, seleccione Confidencial.

  7. En la sección Política de emisión de token, seleccione Específico como Recursos autorizados.

  8. Haga clic en Agregar recursos y, en Recursos, seleccione Agregar ámbito. Seleccione los ámbitos deseados para el servidor de recursos creado en la tarea 4.1. Por ejemplo, privilegetest.

    Configuración del Cliente

  9. Haga clic en Siguiente y en Terminar.

  10. En la página Visión general de la aplicación, seleccione Activar y confirme que desea activar la aplicación. La aplicación confidencial está activada.

  11. Copie el ID de cliente y el Secreto de cliente de esta aplicación de cliente. Estas credenciales serán necesarias para la autenticación.

Tarea 5: Envío de Solicitudes a ORDS mediante un Token de Portador de JWT

Envíe una solicitud de publicación (mediante Postman) al punto final de token de dominio de OCI IAM con Tipo de otorgamiento como client_credentials y Ámbito como privilegetest, como se muestra en la siguiente imagen.

Punto final de token

Nota: El público y el ámbito se deben incluir en el campo de ámbito al solicitar el token de portador del dominio de OCI IAM.

Credenciales de cliente

Valide el token de JWT para ámbitos, emisor y público.

Detalles de token de JWT

Ahora se puede acceder al recurso ORDS protegido (módulo de demostración) del esquema ordstest proporcionando un token de portador de JWT válido con la solicitud get, como se muestra en la siguiente imagen.

Acceso con JWT

ORDS valida el token recuperando la clave pública de la URL de JWK y verificando la firma del token. Si la firma es válida, ORDS comprueba si las reclamaciones iss (emisor) y aud (audiencia) coinciden con las definidas en el perfil de JWT. También verifica que la reclamación de ámbito corresponde al privilegio que protege el recurso. Si se cumplen todas las condiciones, se otorga al usuario acceso al recurso protegido.

Agradecimientos

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de formación gratuita en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.

Para obtener documentación sobre el producto, visite Oracle Help Center.