Información sobre la autenticación entre Node.js Applications y Oracle Identity Cloud Service

Está listo para obtener más información sobre la autenticación entre las aplicaciones web de Node.js y Oracle Identity Cloud Service. Esto incluye la descripción de lo siguiente:

  • Flujo de autenticación de tres plataformas que soporta Oracle Identity Cloud Service para el SDK de Node.js

  • Casos de uso del SDK con una aplicación de Node.js para autenticarse con Oracle Identity Cloud Service

  • Métodos y funciones del SDK de Node.js

Obtener Más Información sobre Flujos de Autenticación Tramitados

Oracle Identity Cloud Service soporta el flujo de autenticación de tres plataformas para el SDK de Node.js. En este flujo, los usuarios interactúan directamente con Oracle Identity Cloud Service. Después de conectarse un usuario, Oracle Identity Cloud Service emite un código de autorización que intercambia el SDK para un token de acceso de usuario. La aplicación web Node.js utiliza este token de acceso para otorgar a los usuarios acceso a los recursos protegidos en la aplicación. El flujo trilegado utiliza el tipo de permiso de código de autorización.

Para mayor seguridad, Oracle recomienda utilizar el flujo con tres leyendas para integrar las aplicaciones web de Node.js con Oracle Identity Cloud Service para la autenticación. Mediante el tipo de permiso de código de autorización, también puede acceder a otras aplicaciones protegidas por Oracle Identity Cloud Service sin tener que volver a autenticarse.

Obtenga información sobre los casos de uso principales para el uso de un SDK con una aplicación de Node.js

La aplicación web Node.js implementa dos casos de uso: uno para autenticar usuarios y otro para acceder a información detallada sobre el usuario conectado.

Los siguientes diagramas de flujo de datos ilustran el flujo de eventos, llamadas y respuestas entre el explorador web, la aplicación web y Oracle Identity Cloud Service para cada caso de uso.

Caso de Uso #1: Autenticación de un Usuario

El flujo de datos se produce de esta forma:

  1. El usuario solicita un recurso protegido.

  2. El módulo de autenticación utiliza el SDK para generar una URL de código de solicitud para Oracle Identity Cloud Service y enviar esta URL como respuesta de redireccionamiento al explorador Web.

  3. El explorador web llama a la URL.

  4. Aparece la página de inicio de sesión de Oracle Identity Cloud Service.

  5. El usuario envía sus credenciales de conexión de Oracle Identity Cloud Service.

  6. Una vez que el usuario se conecta, Oracle Identity Cloud Service crea una sesión para el usuario y emite un código de autorización.

  7. La aplicación web realiza una llamada backend (o de servidor a servidor) para intercambiar el código de autorización de un token de acceso de usuario.

  8. Oracle Identity Cloud Service emite el token de acceso.

  9. Se establece una sesión y se redirige al usuario a la página inicial .

  10. Aparece la página inicial de la aplicación web.

Caso de uso #2: Obtener detalles sobre el usuario

El flujo de datos se produce de esta forma:

  1. El usuario solicita el recurso /myProfile.

  2. La aplicación web llama a Oracle Identity Cloud Service con el SDK, que utiliza el token de acceso almacenado en la sesión de usuario como parámetro.

  3. Los detalles del usuario se envían a la aplicación web como objeto JSON.

  4. La página Mi Perfil presenta el objeto JSON como contenido HTML.

Información sobre métodos y funciones

Node.js SDK es una estrategia de pasaporte de Node.js que se agrega a la carpeta de Node.js modules. Este SDK también se basa en las promesas de Node.js. Todas las dependencias de terceros que necesita Node.js SDK se definen en el archivo package.json del SDK. Debe utilizar al menos este juego de módulos en la aplicación web Node.js.

"dependencies": {
    "async": "^2.1.2",
    "bunyan": "^1.8.5",
    "cache-manager": "^2.2.0",
    "json-web-token": "^2.1.3",
    "jsonwebtoken": "^7.1.9",
    "jwk-to-pem": "^1.2.6",
    "jws": "^3.1.4",
    "lru": "^3.1.0",
    "passport": "^0.3.2",
    "promise": "^7.1.1",
    "querystring": "^0.2.0",
    "request": "^2.79.0",
    "rsa-pem-to-jwk": "^1.1.3",
    "util": "^0.10.3"
  },

Se ha desarrollado una aplicación web de Node.js mediante los módulos Node.js express y express-handlebars, que implanta rutas de URL con el formato de una función app.get() para cada URL.

Node.js SDK necesita una variable JSON que se carga con la información de conexión de Oracle Identity Cloud Service. La aplicación web Node.js utiliza la variable ids para almacenar esta información:

var ids = {
    oracle: {
         "ClientId": '123456789abcdefghij',
         "ClientSecret": 'abcde-12345-zyxvu-98765-qwerty',
         "ClientTenant": 'idcs-abcd1234',
         "IDCSHost": 'https://%tenant%.identity.oraclecloud.com',
         "AudienceServiceUrl" : 'https://idcs-abcd1234.identity.oraclecloud.com',
         "TokenIssuer": 'https://identity.oraclecloud.com/',
         "scope": 'urn:opc:idm:t.user.me openid',
         "logoutSufix": '/oauth2/v1/userlogout',
         "redirectURL": 'http://localhost:3000/callback'
    }
};
 
module.exports = ids;

A continuación se muestra una breve explicación de cada atributo necesario para este SDK:

Nombre Descripción
ClientId Valor del ID de cliente que se genera después de registrar la aplicación web Node.js en la consola de Identity Cloud Service.
ClientSecret Valor del secreto de cliente que se genera después de registrar la aplicación web Node.js en la consola de Identity Cloud Service.
ClientTenant Prefijo de dominio de la instancia de Oracle Identity Cloud Service. Este prefijo suele ser similar a idcs-abcd1234.
IDCSHost Sufijo de dominio de la instancia de Oracle Identity Cloud Service. En tiempo de ejecución, el marcador de posición %tenant% se sustituye por el valor del atributo ClientTenant.
AudienceServiceUrl URL de nombre de dominio totalmente cualificada de la instancia de Oracle Identity Cloud Service.
TokenIssuer Para este atributo, Oracle recomienda mantener el valor https://identity.oraclecloud.com/.
scope

El ámbito controla los datos a los que la aplicación puede acceder o procesar en nombre del usuario de Oracle Identity Cloud Service.

Si la aplicación utiliza el SDK para autenticar un usuario, el ámbito es openid. Si la aplicación utiliza el SDK para obtener detalles sobre el usuario, el ámbito es urn:opc:idm:t.user.me openid.

La aplicación utiliza los atributos logoutSufix y redirectURL. El SDK no los necesita.

La aplicación Node.js implementa la ruta de URL de /oauth/oracle. Cuando un usuario decide autenticarse con Oracle Identity Cloud Service, el explorador web realiza una solicitud a esta URL. Esta ruta utiliza el SDK para generar la URL de autorización de Oracle Identity Cloud Service.

//Loading the configurations
var auth = require('./auth.js');
 
//Route for /oauth/oracle
app.get("/auth/oracle", function(req, res){
    //Authentication Manager loaded with the configurations.
    am = new IdcsAuthenticationManager(auth.oracle);
    //Using Authentication Manager to generate the Authorization Code URL, passing the
    //application's callback URL as parameter, along with code value and code parameter.
    am.getAuthorizationCodeUrl(auth.oracle.redirectURL, auth.oracle.scope, "1234", "code")
        .then(function(authZurl){
            //Redirecting the browser to the Oracle Identity Cloud Service Authorization URL.
            res.redirect(authZurl);
        }).catch(function(err){
            res.end(err);
        })
});

Esta función carga los parámetros de JSON en una variable, inicializa un gestor de autenticación y utiliza la función IdcsAuthenticationManager.getAuthorizationCodeUrl() del SDK de Node.js para generar la URL de código de autorización. Esta función utiliza Promesa para redirigir el explorador web del usuario cuando se genera la URL del código de autorización o para presentar un error en el explorador.

Los siguientes parámetros se utilizan para generar la URL del código de autorización:

Nombre Descripción
auth.oracle.redirectURL Después de conectar un usuario, Oracle Identity Cloud Service redirecciona el explorador web del usuario a esta URL. Esta URL debe coincidir con la que configurará para la aplicación de confianza en la consola de Identity Cloud Service. Consulte Registrar la Aplicación Node.js para obtener más información sobre la especificación de una URL de redireccionamiento para la aplicación web Node.js.
auth.oracle.scope Ámbito de autenticación de OAuth u OpenID Connect. Esta aplicación sólo necesita autenticación de openid.
state El protocolo OAuth define este parámetro. La aplicación web Node.js de ejemplo utiliza este código para comprobar si la comunicación se puede establecer con Oracle Identity Cloud Service. Para este ejemplo, el valor de este parámetro es 1234.
response_type Parámetro necesario para el tipo de permiso de código de autorización. Para este ejemplo, el valor de este parámetro es code.

Después de conectarse el usuario, Oracle Identity Cloud Service redirecciona el explorador web del usuario a una URL de devolución de llamada, que el desarrollador debe implantar. La aplicación web Node.js utiliza la ruta /callback para gestionar esta solicitud.

//Route for /callback
app.get("/callback", function(req,res){
    //Authentication Manager loaded with the configurations.
    var am = new IdcsAuthenticationManager(auth.oracle);
    //Getting the authorization code from the "code" parameter
    var authZcode = req.query.code;
    //Using the Authentication Manager to exchange the Authorization Code to an Access Token.
    am.authorizationCode(authZcode)
        .then(function(result){
            //Getting the Access Token Value.
            res.cookie(config.IDCS_COOKIE_NAME, result.access_token);
            res.redirect('/auth.html');
        }).catch(function(err){
            res.end(err);
        })
});

La aplicación Node.js utiliza el código de autorización para solicitar un token de acceso. El token de acceso se almacena como cookie, que luego se envía al explorador web para su uso posterior.

La función IdcsAuthenticationManager.authorizationCode() del SDK de Node.js también utiliza promise (una sentencia de captura) para definir el token de acceso como cookie y redirigir el explorador a la página /auth.html.

Node.js SDK se basa en el marco de pasaporte de Node.js. Por lo tanto, debe reenviar el token de acceso como una variable de cabecera al manejador de URL de /auth y utilizar el método passport.authenticate() con el nombre de estrategia de Oracle Identity Cloud Service como parámetro:

//Uses passport to create a User Session in Node.js.
//Passport sets a user attribute in the request as a json object.
app.get('/auth', passport.authenticate(config.IDCS_STRATEGY_NAME, {}), function(req, res) {
   res.redirect('/home');
});

Una vez que el método passport.authenticate() crea la sesión de la aplicación, la función redirige el explorador web del usuario a una URL protegida en la aplicación /home. Además de /home, la aplicación web de Node.js tiene tres sistemas de URLs: /appDetails, /userInfo y /myProfile protegidos.

Cada URL protegida necesita comprobar si la sesión del usuario se ha creado anteriormente. Cada función app.get() utiliza la siguiente función para estos URLs.

function ensureAuthenticated(req, res, next) {
   if (req.isAuthenticated()) {
      return next();
   }
   res.redirect('/login')
}

La aplicación Node.js gestiona la ruta de /myProfile y obtiene la información definida en la sesión por el método passport.authenticate(), de la siguiente manera:

app.get("/myProfile", ensureAuthenticated, function(req,res){
   //User Manager loaded with the configurations
   var um = new IdcsUserManager(auth.oracle);
   //Using the user id in the request attribute to render the user json in the screen.
   um.getUser(req.user.id)
      .then(function(user){
         res.render('myProfile', {
         layout: 'privateLayout',
         title: 'My Profile',
         user: req.user,
         userInfo: JSON.stringify(user, null, 2)
         });
      }).catch(function(err1){
         res.end(err1);
      })
});

Después de inicializar el objeto UserManager, el manejador de la ruta de /myProfile utiliza la función IdcsUserManager.getUser() del SDK para obtener un objeto JSON que representa el perfil de usuario. La aplicación envía el objeto JSON al archivo myProfile.handlebars para presentarlo en el explorador web.

Para cerrar la sesión del usuario desde el inicio de sesión único entre la aplicación y Oracle Identity Cloud Service, la aplicación web Node.js implementa la ruta /logout, de la siguiente forma:

app.get('/logout', function(req, res){
   req.logout();
   res.clearCookie();
   res.redirect(auth.oracle.IDCSHost + auth.oracle.logoutSufix);
});

Esta ruta invalida la sesión de la aplicación, elimina las cookies establecidas anteriormente y, a continuación, redirecciona el explorador web del usuario a la URL de desconexión de OAuth de Oracle Identity Cloud Service. Esta URL se configura en el objeto de configuración de JSON.