Artículo
· 28 feb, 2023 Lectura de 6 min

Como controlar el acceso a tus recursos con OAuth2

Buenas a todos,

una de las herramientas potentes que tiene Intersystems es la posibilidad de implementar en el propio sistema la autenticación OAuth2. Esta herramienta nos da la posibilidad de poder controlar quien accede a nuestros recursos y como accede. 

A continuación planteo una solución ante el problema de querer controlar quien accede a mis recursos y la posibilidad de monitorizarlo. Para ello deberemos seguir los siguientes pasos:

1.- Definir un Servidor de Autenticacion

        1.1.- Crear Servidor

        1.2.- Crear Cliente del Servidor

        1.3.- Crear Servidor de Recursos

        1.4.- Crear cliente de Servidor de Recursos

2.- Definir un servicio SOPA/REST para acceder a los recursos.

        2.1.- Crear Servicio

        2.2.- Validar Acceso desde el servicio

** Os intentaré ir dejando capturas del portal de gestión para situaros mejor en el proceso. Si lo seguís secuencialmente no deberíais tener problema para completar el proceso.

Teniendo claros los pasos a seguir, ¡COMENCEMOS!

Presentación del Problema:

Supongamos que tenemos un Servicio que accede a unos recursos determinados. La publicación de este servicio es accesible por todo aquel cliente que ataque el servicio, y deseamos controlar quien accede a estos recursos, pues no queremos que todo el mundo acceda a los recursos, ademas que tampoco queremos que los clientes autorizados para acceder a los mismos puedan acceder a los recursos de otros que también tengan permisos, por lo que vamos a ponerle un "portero" al servicio para que nos asegure que este cliente tiene autorizado acceder a nuestros recursos.

Para solucionar este problema de forma ágil, haremos uso del servidor de autenticación OAuth2 que podemos utilizar en IRIS siguiendo los siguientes pasos:

1.1.- Crear Servidor

En la Producción Web seleccionamos Administración>seguridad>oauth2.0>servidor y deberíamos observar:

A continuación, necesitamos escribir en el formulario:

URL: DNS o IP del Servidor donde se va a alojar el Servidor de Autorización

Puerto: Puerto interno del Servidor Web [p.e: 57773]

  • El puerto del Apache interno es el que se debe utilizar, seguramente sea necesario habilitar el acceso a estos puertos con edición del fichero httpd.conf

Prefijo: Indicar la aplicación donde se va a alojar el Servidor de Autorización. De forma automática se crea la aplicación al guardar el servidor. [p.e: oauth2]

Tipos de concesiones: deja solo credenciales de cliente

Configuración SSL/TLS: Certificado SSL que tengamos

En la segunda pestaña, nombrada como “Ámbitos” define my/scope así:

Ámbito      | my/scope    | Introducir ámbito compatible: my/scope
Descripción | First Scope | Introducir descripción del ámbito: First Scope

Además, en la 5ª pestaña, “Personalización”; hay que configurar el cuarto valor:

Generar clase de token: %OAuth2.Server.JWT

Guardar y ya deberíamos ver que se ha creado.

En este punto, tenemos el servidor creado.
 

1.2.- Crear Cliente del Servidor 

Estando en la pantalla de: Administración>seguridad>oauth2.0>servidor; pulsar en el botón “Descripciones de cliente”.

Esto nos permitirá indicar qué clientes pudieran autorizarse en nuestro servidor. En concreto nos creamos uno de ejemplo:

 

Nombre

cliente desde postman

Identificador del Cliente a nivel local.

ID del cliente 

HbOAGs6byL-gTlabW8gCDguQnYyHCWT82EToGTjP5fQ

Valor del ID del Cliente.

Tipo de cliente 

confidential

 

URL de redireccionamiento 

https://DNS/IP:57773

DNS y Puerto del Servidor de Autorización configurados en el apartado 2.1

Descripción

cliente servidor de autenticación

Descripción del Cliente.

 

Al guardarlo deberíamos observar:

Llegados aquí, ya disponemos de un servidor de autenticación con un cliente. El proceso ahora consiste en obtener el token de acceso del servidor en base a las credenciales de acceso que acabamos de crear. Una vez obtenemos este token, deberemos validarlo al intentar acceder a los recursos.

Procedimiento para obtener el token:
A) Atacar por REST a: https://DNS/IP:57773/oauth2/token?grant_type=client_credentials&scope=my/scope

    con datos: 

  • Authorizacion= Basic OAuth
  • Username= clientID (obtenido de la definición del cliente creada en el paso 1.2)
  • Password=SecretID (obtenido de la definición del cliente creada en el paso 1.2)

Esta petición nos devolverá un TOKEN de acceso que tendremos que validar a continuación.

 

1.3.- Crear Servidor de Recursos

En  Sistema > Gestión de seguridad > Cliente de OAuth 2.0 > Descripción del servidor  - (Configuración de seguridad)  

 

1.4.- Crear cliente de Servidor de Recursos

Con el objetivo de definir a qué información se accede una vez el Sistema Externo se ha validado, se construye el “Servidor de Recursos”.

Para generar el Servidor de Recursos, debemos estar en:   Sistema > Gestión de seguridad > Configuración del servidor de autorización OAuth 2.0 > Servidor de OAuth 2.0 y pulsar en el botón “Crear la descripción de cliente” tal y como se muestra en la siguiente captura:

NOMBRE: resserver

Descripción: [Texto descriptivo]

Tipo de cliente: Servidor de recursos

Tipo de concesiones: Código de autorización

Tipo de concesiones compatibles: código

Tipo de autenticación: básico

 

Llegados a este punto, Ya hemos definido un servidor de autenticación y un servidor de recursos, ¡Vamos a unirlo todo!

 

A continuación debemos incluir en nuestro servicio SOAP o REST el control para validar el token generado por el servidor de autenticación, para ello incluiremos en nuestro servicio lo siguiente:
 

Parameter OAUTH2APPNAME = "resserver";

Parameter OAUTH2SCOPES = "openid profile email my/scope";
 

Dentro del método del servicio al principio:

set authorization = $tr(pInput.GetAttribute("authorization"),"")
set tokenSinBearer = $PIECE(authorization,"Bearer ",2)

set tSC= ..ResServer(tokenSinBearer)

 

Método:

ClassMethod ResServer(accessToken As %String(MAXLEN="")) As %Status
{
    // validate token
    set isJWTValid = ##class(%SYS.OAuth2.Validation).ValidateJWT("resserver",accessToken,"","",.jwtPayload ,.securityParameters,.sc)     if (('isJWTValid) || ($$$ISERR(sc))) {         quit '$$$OK
    }
                                               
    // introspection
    set sc = ##class(%SYS.OAuth2.AccessToken).GetIntrospection("resserver", accessToken, .jsonObject)
    if $$$ISERR(sc) {         quit '$$$OK
    }    
  
    quit $$$OK
}

Con este método lo que vamos a realizar es la validación del token recibido en el servicio contra el servidor de autenticación. La respuesta tSC es la que deberemos validar para dar acceso o no al resto de recursos a los que accede el servicio, de una forma esquematizada sería:

Method misRecursos(pInput As %Stream.Object, Output pOutput As %Stream.Object) As %Status

{

set authorization = $tr(pInput.GetAttribute("authorization"),"")
set tokenSinBearer = $PIECE(authorization,"Bearer ",2)

set tSC= ..ResServer(tokenSinBearer)

if (tSC= 1){

   ACCESO A LOS RECURSOS

   quit pOutput 

}else{

quit '$$$OK

}

}

 

En resumidas cuentas, el servidor de autenticación OAUTH2 nos sirve para generar un token en base al clientID y secretID que hemos generado al crear el cliente para el mismo Servidor OUATH2. Este Token seguidamente lo enviaremos al servidor de recursos que previo al acceso de los mismos, validara este token contra el servidor de autenticación, y si es correcto, nos dará acceso a los mismos.

El proceso completo os lo dejo aquí indicado:

Finalmente si quisiéramos aplicar algún control extra, lo podemos realizar dentro del Business Process incluyéndole en el control la información de clientID que queramos monitorizar y/o validar.

Comentarios (0)1
Inicie sesión o regístrese para continuar