Artículo
· 26 feb, 2024 Lectura de 5 min

Cómo usar OAuth 2.0 / OIDC para el inicio de sesión único en una aplicación IRIS REST

He estado desarrollando una aplicación web que utiliza IRIS como back-end. Trabajé en ella con acceso no autenticado. Estoy llegando al punto en el que me gustaría implementarla para los usuarios, pero primero necesito añadir la autenticación. En vez de utilizar la contraseña para la autenticación predeterminada de IRIS (con contraseña), me gustaría que los usuarios iniciaran sesión con el Inicio de Sesión Único (SSO) de mi organización, o con algún otro proveedor de identidad popular como Google o GitHub. He leído que OpenID Connect es un estándar de autenticación común, y que es admitido por IRIS. ¿Cuál es la forma más sencilla de ponerlo en marcha?

Ejemplo 1: una aplicación CSP simple

La documentación muestra una opción bastante sencilla para utilizar una aplicación CSP como cliente de OpenID Connect.

Los pasos para ello son los siguientes:

  1. Configurar el servidor OAuth 2.0 y el cliente en IRIS. Consultad la sección "Configuración de Caché" del estupendo artículo de Daniel Kutac para obtener más información.

  2. Copie la rutina OAUTH2.ZAUTHENTICATE del repositorio de ejemplos en GitHub en el Namespace %SYS y renombrarlo como ZAUTHENTICATE.

  3. Habilitar la autenticación delegada en todo el sistema.

  4. Crear una página de inicio de sesión personalizada que se extienda desde %OAuth2.Login, y anule el método DefineParameters para especificar el nombre de la aplicación OAuth 2.0 y los ámbitos:

Class MyOAuth2.Login Extends %OAuth2.Login
{

ClassMethod DefineParameters(Output application As %String, Output scope As %String, Output responseMode As %String)
{
    Set application="my application name"
    Set scope="openid profile email"
    Set responseMode=..#RESPONSEMODE
    Quit
}

}
  1. Habilitar la aplicación web para la autenticación delegada y establecer la página de inicio de sesión personalizada en MyOAuth2.Login.cls.

  2. Un truco final: Para que la página de inicio de sesión personalizada funcione, el usuario CSPSystem en IRIS necesita que se le conceda específicamente acceso de LECTURA (READ) a la base de datos en la que vive MyOAuth2.Login.cls.

En ese momento, el inicio de sesión debería "simplemente funcionar": visitar una página CSP en esa aplicación web redirigirá a la página de inicio de sesión en el proveedor de identidad. Después de iniciar sesión, el usuario tendrá una sesión CSP autenticada. Su $username será igual a su identificador de sujeto de SSO/Google/GitHub/donde sea, así que puedo utilizar la autorización incorporada de IRIS para determinar a qué cosas dar acceso.

Ejemplo 2: el problema con REST

¿Qué ocurre si la aplicación web utiliza un controlador REST? El proceso anterior no funciona. Si una aplicación web está habilitada para REST, no hay forma de definir una página de inicio de sesión personalizada. He descubierto que se necesitan algunos pasos más para solucionar este problema.

  1. Crear una aplicación web independiente que no tenga REST habilitado. La ruta de esa aplicación debe comenzar con la ruta de la aplicación REST. Por ejemplo, si la aplicación REST se llama "/csp/api", podríamos llamar a esta nueva aplicación "/csp/api/login". Hay que habilitar la autenticación delegada y establecer la página de inicio de sesión personalizada en la página MyOAuth2.Login.cls.

  2. Establecer la Ruta de la Cookie de Sesión en esta nueva aplicación como la misma que la de la aplicación REST: por ejemplo, "/csp/api". Esto permitirá que ambas aplicaciones compartan una sesión CSP.

  3. Añadir una página CSP a esta nueva aplicación que actuará como "página de inicio". Un usuario deberá acceder primero a esta página para establecer su sesión. Este es un ejemplo que redirige a un endpoint en la API REST tras el inicio de sesión:

Class App.Home Extends %CSP.Page
{

ClassMethod OnPage() As %Status [ ServerOnly = 1 ]
{
    &html
    return $$$OK
}

}
  1. Asegurarsese de que la clase del controlador REST tiene el parámetro UseSession anulado a true.
Class API.REST Extends %CSP.REST
{

Parameter UseSession As BOOLEAN = 1;

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{



}

ClassMethod Test() As %Status
{
    write { "username": ($username) }.%ToJSON()
    return $$$OK
}

}

En este punto, el inicio de sesión en la aplicación REST también "simplemente funcionará". El usuario visitará la página de inicio, será redirigido al inicio de sesión SSO y, finalmente, volverá a la aplicación REST, donde tendrá una sesión CSP autenticada. Hasta donde yo sé, ésta es la forma más sencilla de añadir OpenID Connect a una aplicación IRIS REST.

Otra opción es utilizar la muestra "REST.ZAUTHENTICATE" del repositorio de muestras de seguridad. Esto espera que el front-end adjunte un token de portador OAuth 2.0 a cada solicitud. Sin embargo, no hay una forma definida para que el front-end obtenga este token de acceso. Habrá que implementar ese flujo OAuth en JavaScript (o usar una librería como angular-oauth2-oidc.) También hay que asegurarse de que la aplicación JavaScript y el back-end de IRIS coinciden en todos los elementos de la configuración como el endpoint emisor del servidor de autorización, el id de cliente OAuth 2.0, etc. He descubierto que esto no es una tarea sencilla.

Tengo curiosidad por saber si alguien más utiliza OpenID Connect para autenticar una aplicación IRIS. ¿Existe una forma aún más sencilla? ¿O merece la pena utilizar el enfoque más complicado con tokens de portador? Podéis comentarlo más abajo.

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