Siempre que desarrollemos APIs en Oracle APEX, tenemos la posibilidad de dejar el API abierta de manera que se pueda utilizar sin ningún tipo de autenticación, sin embargo, esto puede terminar siendo un hueco de seguridad dependiendo lo que realice esa API, es por ello que en este laboratorio vamos a implementar el método de autenticación oauth2.0 en los módulos que desarrollemos en Oracle APEX.
Cuando configuramos el ORDS en nuestro schema de desarrollo en Oracle APEX veremos que por default se crea un módulo y algunos privilegios y roles.
Si queremos, podemos crear nuestro propio módulo REST en Oracle APEX, para ello les dejo la siguiente documentación donde explico un ejemplo de cómo hacerlo: Cómo crear un API Restful en Oracle APEX
Para este lab vamos a trabajar con el módulo oracle.example.hr

Paso 1 – Creación del Rol
Lo primero que debemos hacer es crear un rol, este únicamente nos pedirá un nombre representativo para diferenciarlo de los demás roles.
Le llamaremos: Rol de clientes

Paso 2 – Creación del privilegio
Ahora, crearemos el privilegio, dentro de la creación del privilegio nos solicitará definir lo siguiente:
- Nombre del privilegio – Este será el identificador para cuando lo asignemos a los clientes
- Título – Nombre representativo del privilegio
- Roles – Seleccionaremos los roles que tendrán permiso de acceso a los módulos elegidos
- Protected Modules – Elegiremos los módulos que queramos añadirle la capa seguridad
Tanto al nombre del privilegio como el título le podremos Consultas, luego en rol elegimos Rol de clientes y por último en protected modules elegimos oracle.example.hr

Paso 3 – Creación de clientes para la autenticación
Lo siguiente que debemos hacer, es crear las credenciales de acceso para los clientes que vayan a interactuar con el API o el módulo.
Vamos al SQL Command de Oracle APEX y ejecutaremos el siguiente script para crear el cliente:
- p_name – Nombre del cliente
- p_grant_type – Tipo de grant para el cliente
- p_owner – Schema donde tenemos creado nuestros módulos en Oracle APEX
- p_description – Breve descripción del cliente
- p_support_email – Correo electrónico del cliente
- p_privilege_names – Name del privilegio que creamos en el paso 2
BEGIN OAUTH.create_client( p_name => 'Proveedor1', p_grant_type => 'client_credentials', p_owner => 'TESIS', p_description => 'Ejemplo de creación cliente Oauth2', p_support_email => 'oracle.max.consultor@gmail.com', p_privilege_names => 'Consultas' ); COMMIT; END;

Nota: Si quisiéramos borrar un cliente, podemos ejecutar el siguiente script:
BEGIN OAUTH.delete_client( p_name => 'Proveedor1'); COMMIT; END;
Paso 4 – Asignación del rol al cliente
Para que la asignación del privilegio durante la creación del cliente funcione, debemos asignarle un rol a ese cliente, para ello ejecutaremos el siguien script en el SQL Command:
BEGIN oauth.grant_client_role(p_client_name => 'Proveedor1', p_role_name => 'Rol de clientes'); COMMIT; END;
Paso 5 – Verificación del client id y cliente secret
Para que nuestros proveedores pueden interactuar con el API protegida, deberemos entregarles un client id y un client secret exclusivo para cada uno, para verlo debemos ejecutar el siguiente script:
SELECT ID,NAME,CLIENT_ID,CLIENT_SECRET FROM user_ords_clients WHERE name = 'Proveedor1';

Paso 6 – Prueba de la autenticación utilizando Postman
Consideración 1
Antes de hacer las pruebas, si estamos en el ambiente de desarrollo y este ambiente no cuenta con un certificado SSL para cifrar la conexión con el ORDS, cuando tratemos de interactuar con el API nos dará error.
Para corregirlo solamente añada la siguiente línea al archivo default.xml del ORDS y reinícielo:
<entry key="security.verifySSL">false</entry>
En caso de utilizar Weblogic como forma de despliegue del ORDS, deberá deshabilitar la seguridad de Weblogic para poder recibir tokens en el ambiente de desarrollo, vea la siguiente documentación para conocer cómo hacerlo: Solución: Authentication error with OAuth 2.0
Consideración 2
Si esta implementando un certificado SSL o desea implementarlo, deberá aplicar la siguiente configuración para forzar siempre el uso de https en las solicitudes, utilizando el ORDS: Solución: 403 Forbidden – Las solicitudes de Cross Origin Sharing no están soportadas en ORDS con SSL
Prueba en Postman
Utilizando postman vamos a realizar una solicitud de autenticación para obtener el token de sesión y así poder interactuar con el API:
El url de la conexión estará compuesta de la siguiente manera:
http://<ip o dns del servidor>:<puerto>/<nombre de la ruta de acceso del ords>/<schema>/oauth/token
En mi caso es la siguiente: http://192.168.1.50:8080/ords/tesis/oauth/token

Luego en las opciones de Configure New Token -> Configuration options colocaremos lo siguiente:
- Token Name – Access_token
- Grant Type – Client Credentials
- Access Token URL – http://192.168.1.50:8080/ords/tesis/oauth/token
- Client ID – El client ID del paso 5
- Client Secret – El client secret del paso 5
- Scope – En blanco
- Client Authentication – Send as auth header

Probamos la solicitud del token de acceso:


De esta manera logramos asegurar el acceso a nuestras APIs utilizando el método de autenticación OAuth2.0.
Donde veo mi Access Token URL?
En la documentación explico como se compone el access token::///oauth/token, en el postman, el access token url, es el mismo que esta arriba en el campo que dice POST.
http://
Si tengo la instancia gratuita on cloud se puede implementar de igual manera?
Si tiene acceso al servidor del ORDS sí, sino no, la instancia gratuita de Oracle Cloud no lo permite, tendría que ser una máquina en OCI donde sí pueda instalar el ORDS manual e implementarlo manualmente.
Una Duda se puede implementar algún tipo de seguridad a los endpoints en la instancia gratuita de Oracle Cloud para testear?
Lo mismo que indiqué en la respuesta anterior, si tiene acceso a la infraestructura sí, sino no, lo que se complica esque la instancia gratuita no permite acceder a la configuración del ords porque ya todo lo da configurado, entonces para configuraciones avanzadas se debe hacer on premise o pagar
Como obtener el token desde un cliente que no sea postman? es decir que HTTP request hace por debajo para implmentarlo en una aplicacion cliente como tal… (CURL syntax)
Puedes usar el siguiente curl:
curl -v -X POST http://192.168.1.50:8080/ords/tesis/oauth/token -d «client_id=suClientId&client_secret=suClientSecret&grant_type=client_credentials»
Y recibirás algo como esto:
{«access_token»: «6737bdkdndk737738jdjdj» «token_type»:»bearer», «expires_in»:3600}