Obtener información sobre la autenticación entre aplicaciones Node.js y Oracle Identity Cloud Service
Ya está listo para obtener más información sobre la autenticación entre las aplicaciones web Node.js y Oracle Identity Cloud Service. Esto incluye comprender lo siguiente:
-
Flujo de autenticación de tres partes que soporta Oracle Identity Cloud Service para el SDK Node.js
-
Casos de uso de un SDK con una aplicación Node.js para autenticarse con Oracle Identity Cloud Service
-
Métodos y funciones del SDK Node.js
Más información sobre flujos de autenticación de tres segmentos
Oracle Identity Cloud Service soporta el flujo de autenticación de tres partes para el SDK Node.js. En este flujo, los usuarios interactúan directamente con Oracle Identity Cloud Service. Después de que un usuario se conecte, Oracle Identity Cloud Service emite un código de autorización que el SDK intercambia 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 de la aplicación. El flujo de tres partes utiliza el tipo de permiso de código de autorización.
Para aumentar la seguridad, Oracle recomienda utilizar el flujo de tres partes para integrar las aplicaciones web 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.
Más información sobre los casos de uso principales para utilizar un SDK con una aplicación Node.js
La aplicación web Node.js implanta dos casos de uso: uno para autenticar usuarios y el 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 n.o 1: Autenticar un usuario
El flujo de datos se produce de esta forma:
-
El usuario solicita un recurso protegido.
-
El módulo de autenticación utiliza el SDK para generar una URL de solicitud-autorización-código para Oracle Identity Cloud Service y enviar esta URL como respuesta de redirección al explorador web.
-
El explorador web llama a la URL.
-
Aparecerá la página Conectar de Oracle Identity Cloud Service.
-
El usuario envía sus credenciales de conexión de Oracle Identity Cloud Service.
-
Después de que el usuario se conecte, Oracle Identity Cloud Service crea una sesión para el usuario y emite un código de autorización.
-
La aplicación web realiza una llamada de backend (o de servidor a servidor) para intercambiar el código de autorización por un token de acceso.
-
Oracle Identity Cloud Service emite un token de acceso y un token de ID.
-
Se establece una sesión y se redirige al usuario a la página Inicio.
-
Aparece la página Inicio de la aplicación web.
Caso de uso n.o 2: Obtener detalles sobre el usuario
El flujo de datos se produce de esta forma:
-
El usuario solicita el recurso
/myProfile
. -
La aplicación web utiliza el SDK de Oracle Identity Cloud Service para validar el token de ID.
-
Los datos que se devuelven de la validación del token de ID contienen los detalles del usuario con el formato de un objeto JSON.
-
La página Mi perfil representa el objeto JSON como contenido HTML.
Más información sobre métodos y funciones
El SDK de Node.js es una estrategia de pasaporte Node.js que agrega a la carpeta Node.js modules
. Este SDK también se basa en las promesas de Node.js.
Todas las dependencias de terceros que necesita el SDK de Node.js se definen en el archivo package.json
del SDK dentro del archivo zip del SDK de Node.js que descarga desde la consola de Oracle Identity Cloud Service. 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": "^8.2.1",
"jwk-to-pem": "^1.2.6",
"jws": "^3.1.5",
"lru": "^3.1.0",
"passport": "^0.4.0",
"promise": "^8.0.1",
"querystring": "^0.2.0",
"request": "^2.81.0",
"rsa-pem-to-jwk": "^1.1.3",
"util": "^0.10.3"
},
Se ha desarrollado una aplicación web Node.js mediante los módulos Node.js express
y express-handlebars
, que implanta rutas de URL en forma de función app.get()
para cada URL.
El SDK de Node.js necesita una variable JSON cargada con 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",
"LogLevel":"INFO",
"ConsoleLog":"True"
}
};
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 Oracle 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 Oracle 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 completo 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 |
ConsoleLog |
Activa el log del SDK. |
LogLevel |
Indica el nivel de log del SDK. |
La aplicación utiliza los atributos logoutSufix
y redirectURL
para evitar codificar estos valores. El SDK no los necesita.
La aplicación Node.js implanta la ruta de URL /oauth/oracle
. Cuando un usuario se autentica con Oracle Identity Cloud Service, el explorador web realiza una solicitud GET 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 del código de autorización. Esta función utiliza la promesa de redirigir el navegador web del usuario cuando se genera la URL del código de autorización o de generar un error en el navegador.
Se utilizan los siguientes parámetros para generar la URL del código de autorización:
Nombre | Descripción |
---|---|
auth.oracle.redirectURL |
Después de que un usuario se conecte, Oracle Identity Cloud Service redirige 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 Registro de la aplicación Node.js para obtener más información sobre la especificación de una URL de redirección para la aplicación web Node.js. |
auth.oracle.scope |
Ámbito de autenticación de OAuth o OpenID Connect. Esta aplicación solo necesita autenticación openid .
|
state |
El protocolo OAuth define este parámetro. La aplicación web Node.js de ejemplo utiliza este código para comprobar si se puede establecer la comunicación con Oracle Identity Cloud Service. Para este ejemplo, el valor de este parámetro es 1234 .
|
response_type |
Parámetro requerido por el tipo de permiso de código de autorización. Para este ejemplo, el valor de este parámetro es code .
|
Después de que el usuario se conecte, Oracle Identity Cloud Service redirige 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 manejar 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 and Id Token Values to set in the session.
req.session.access_token = result.access_token;
req.session.id_token = result.id_token;
res.cookie(config.IDCS_COOKIE_NAME, result.access_token);
res.header('idcs_user_assertion', 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 una cookie, que luego se envía al navegador web para su uso futuro.
La función IdcsAuthenticationManager.authorizationCode()
del SDK de Node.js también utiliza la promesa (una sentencia then-catch) para definir el token de acceso como cookie y para redirigir el explorador a la página /auth.html
.
El SDK de Node.js se basa en el marco de pasaporte Node.js. Por lo tanto, el explorador tiene que reenviar el token de acceso como variable de cabecera al manejador de URL /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');
});
Después de que el método passport.authenticate()
cree 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 Node.js tiene otra URL protegida: /myProfile
.
Cualquier URL protegida debe comprobar si la sesión del usuario se ha creado anteriormente. Cada función app.get()
utiliza la siguiente función para estas URL.
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login')
}
La aplicación Node.js maneja la ruta /myProfile
y obtiene la información definida en la sesión, de la siguiente forma:
app.get("/myProfile", ensureAuthenticated, function(req,res){
//User Manager loaded with the configurations
var am = new IdcsAuthenticationManager(auth.oracle);
//Validating id token to acquire information such as UserID, DisplayName, list of groups and AppRoles assigned to the user.
am.validateIdToken(req.session['id_token'])
.then(function(idToken){
res.render('myProfile', {
layout: 'privateLayout',
title: 'My Profile',
user: req.user,
userInfo: JSON.stringify(idToken, null, 2)
});
}).catch(function(err1){
res.end(err1);
})
});
Después de inicializar el objeto IdcsAuthenticationManager
, el manejador de la ruta /myProfile
utiliza la función IdcsAuthenticationManager.validateIdToken()
del SDK para adquirir información de usuario como el nombre mostrado, el ID de usuario y la lista de grupos y roles de aplicación asignados al usuario. A continuación, el objeto JSON se analiza como cadena en el archivo myProfile.handlebars
para su representación en el explorador web.
Para desconectar al usuario de la conexión única entre la aplicación y Oracle Identity Cloud Service, la aplicación web Node.js implanta la ruta /logout
, de la siguiente forma:
app.get('/logout', function(req, res){
var id_token = req.session.id_token;
var logouturl = auth.oracle.AudienceServiceUrl + auth.oracle.logoutSufix + '?post_logout_redirect_uri=http%3A//localhost%3A3000&id_token_hint='+ id_token;
req.session.destroy(function(err) {
if(err) {
console.log(err);
} else {
req.logout();
res.clearCookie();
res.redirect(logouturl);
}
})
});
Esta ruta invalida la sesión de la aplicación, elimina cualquier objeto y cookie definido anteriormente y, a continuación, redirige el explorador web del usuario a la URL de desconexión OAuth de Oracle Identity Cloud Service.