Informazioni sull'autenticazione tra applicazioni Node.js e Oracle Identity Cloud Service

Si è pronti per informazioni sull'autenticazione tra le applicazioni Web Node.js e Oracle Identity Cloud Service. Ciò include quanto riportato di seguito.

  • Il flusso di autenticazione a tre fasi supportato da Oracle Identity Cloud Service per l'SDK di Node.js

  • Casi d'uso di un SDK con un'applicazione Node.js per eseguire l'autenticazione con Oracle Identity Cloud Service

  • Metodi e funzioni dell'SDK di Node.js

Informazioni sui flussi di autenticazione tridimensionali

Oracle Identity Cloud Service supporta il flusso di autenticazione a tre fasi per l'SDK di Node.js. In questo flusso gli utenti interagiscono direttamente con Oracle Identity Cloud Service. Dopo che un utente si collega, Oracle Identity Cloud Service emette un codice di autorizzazione che viene scambiato da un token di accesso utente. L'applicazione Web Node.js utilizza questo token di accesso per concedere agli utenti l'accesso alle risorse protette nell'applicazione. Il flusso a tre fasi utilizza il tipo di autorizzazione codice autorizzazione.

Per una maggiore sicurezza, Oracle consiglia di utilizzare il flusso a tre fasi per integrare le applicazioni Web Node.js con Oracle Identity Cloud Service per l'autenticazione. Utilizzando il tipo di concessione del codice autorizzazione, è inoltre possibile accedere ad altre applicazioni protette da Oracle Identity Cloud Service senza dover ripetere l'autenticazione.

Informazioni sui casi d'uso principali per l'uso di un SDK con un'applicazione Node.js

L'applicazione Web Node.js implementa due casi d'uso: uno per l'autenticazione degli utenti e l'altro per accedere alle informazioni dettagliate sull'utente collegato.

I diagrammi di flusso di dati seguenti illustrano il flusso di eventi, chiamate e risposte tra il browser Web, l'applicazione Web e Oracle Identity Cloud Service per ogni caso d'uso.

Caso d'uso n. 1: autenticazione di un utente

Il flusso di dati viene eseguito in questo modo:

  1. L'utente richiede una risorsa protetta.

  2. Il modulo di autenticazione utilizza l'SDK per generare l'URL del codice di richiesta per Oracle Identity Cloud Service e inviare questo URL come risposta di reindirizzamento al browser Web.

  3. Il browser Web chiama l'URL.

  4. Viene visualizzata la pagina Collegamento di Oracle Identity Cloud Service.

  5. L'utente sottomette le credenziali di accesso a Oracle Identity Cloud Service.

  6. Dopo che l'utente si collega, Oracle Identity Cloud Service crea una sessione per l'utente ed emette un codice di autorizzazione.

  7. L'applicazione Web effettua una chiamata backend (o da server a server) per scambiare il codice di autorizzazione per un token di accesso utente.

  8. Oracle Identity Cloud Service emette il token di accesso.

  9. Viene stabilita una sessione e l'utente viene reindirizzato alla home page .

  10. Viene visualizzata la home page dell'applicazione Web.

Caso d'uso n. 2: informazioni dettagliate sull'utente

Il flusso di dati viene eseguito in questo modo:

  1. L'utente richiede la risorsa /myProfile.

  2. L'applicazione Web chiama Oracle Identity Cloud Service mediante SDK, che utilizza il token di accesso memorizzato nella sessione utente come parametro.

  3. I dettagli dell'utente vengono inviati all'applicazione Web come oggetto JSON.

  4. La pagina Profilo personale presenta l'oggetto JSON come contenuto HTML.

Informazioni sui metodi e sulle funzioni

Node.js SDK è una strategia di passaporto Node.js che si aggiunge alla cartella Node.js modules. Questo SDK si basa anche sulle promesse Node.js. Tutte le dipendenze di terze parti necessarie per l'SDK Node.js sono definite nel file package.json dell'SDK. È necessario utilizzare almeno questo set di moduli nell'applicazione 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"
  },

Un'applicazione Web Node.js è stata sviluppata utilizzando i moduli Node.js express e express-handlebars che implementa gli instradamenti URL sotto forma di funzione app.get() per ogni URL.

L'SDK di Node.js richiede una variabile JSON caricata con le informazioni di connessione di Oracle Identity Cloud Service. L'applicazione Web Node.js utilizza la variabile ids per memorizzare queste informazioni:

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;

Di seguito è riportata una breve spiegazione di ogni attributo richiesto per questo SDK:

Nome Descrizione
ClientId Il valore dell'ID client generato dopo la registrazione dell'applicazione Web Node.js nella console Identity Cloud Service.
ClientSecret Il valore del segreto client generato dopo la registrazione dell'applicazione Web Node.js nella console Identity Cloud Service.
ClientTenant Prefisso di dominio dell'istanza Oracle Identity Cloud Service. Questo prefisso è in genere simile a idcs-abcd1234.
IDCSHost Suffisso di dominio dell'istanza di Oracle Identity Cloud Service. In fase di esecuzione, il segnaposto %tenant% viene sostituito dal valore dell'attributo ClientTenant.
AudienceServiceUrl L'URL del nome dominio completamente qualificato dell'istanza di Oracle Identity Cloud Service.
TokenIssuer Per questo attributo, Oracle consiglia di conservare il valore https://identity.oraclecloud.com/.
scope

L'ambito controlla i dati che l'applicazione può accedere o elaborare per conto dell'utente Oracle Identity Cloud Service.

Se l'applicazione utilizza il kit SDK per autenticare un utente, l'ambito è openid. Se l'applicazione utilizza il kit SDK per ottenere i dettagli dell'utente, l'ambito è urn:opc:idm:t.user.me openid.

L'applicazione utilizza sia gli attributi logoutSufix che redirectURL. L'SDK non li richiede.

L'applicazione Node.js implementa l'instradamento dell'URL di /oauth/oracle. Quando un utente decide di eseguire l'autenticazione con Oracle Identity Cloud Service, il browser Web effettua una richiesta per l'URL. Questo instradamento utilizza SDK per generare l'URL di autorizzazione di 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);
        })
});

Questa funzione carica i parametri JSON in una variabile, inizializza un Authentication Manager e utilizza la funzione IdcsAuthenticationManager.getAuthorizationCodeUrl() dell'SDK Node.js per generare l'URL del codice di autorizzazione. Questa funzione utilizza la promessa per reindirizzare il browser Web dell'utente quando viene generato l'URL del codice di autorizzazione o per visualizzare un errore nel browser.

I seguenti parametri vengono utilizzati per generare l'URL del codice di autorizzazione:

Nome Descrizione
auth.oracle.redirectURL Dopo che un utente si collega, Oracle Identity Cloud Service reindirizza il browser Web dell'utente a questo URL. Questo URL deve corrispondere a quello che verrà configurato per l'applicazione protetta nella console di Identity Cloud Service. Per ulteriori informazioni su come specificare un URL di reindirizzamento per l'applicazione Web Node.js, vedere Registrare l'applicazione Node.js.
auth.oracle.scope L'ambito di autenticazione OAuth o OpenID Connect. Questa applicazione richiede solo l'autenticazione openid.
state Il protocollo OAuth definisce questo parametro. L'applicazione Web Node.js di esempio utilizza questo codice per controllare se è possibile stabilire la comunicazione con Oracle Identity Cloud Service. Per questo esempio, il valore di questo parametro è 1234.
response_type Il parametro richiesto dal tipo di autorizzazione del codice di autorizzazione. Per questo esempio, il valore di questo parametro è code.

Dopo che l'utente si collega, Oracle Identity Cloud Service reindirizza il browser Web dell'utente a un URL di callback che deve implementare lo sviluppatore. L'applicazione Web Node.js utilizza l'instradamento /callback per gestire questa richiesta.

//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);
        })
});

L'applicazione Node.js utilizza il codice di autorizzazione per richiedere un token di accesso. Il token di accesso viene memorizzato come cookie e quindi inviato al browser Web per uso futuro.

La funzione IdcsAuthenticationManager.authorizationCode() di Node.js SDK utilizza anche la promessa (istruzione di recupero) per impostare il token di accesso come cookie e per reindirizzare il browser alla pagina /auth.html.

L'SDK di Node.js si basa sul framework del passaporto di Node.js. Pertanto, è necessario inoltrare il token di accesso come variabile di intestazione all'handler di URL /auth e utilizzare il metodo passport.authenticate() con il nome della strategia Oracle Identity Cloud Service come parametro:

//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');
});

Dopo che il metodo passport.authenticate() ha creato la sessione dell'applicazione, la funzione reindirizza il browser Web dell'utente a un URL protetto nell'applicazione /home. Oltre a /home, l'applicazione Web Node.js dispone di altri URLs protetti: /appDetails, /userInfo e /myProfile.

Ogni URL protetto deve controllare se la sessione dell'utente è stata creata in precedenza. La funzione seguente viene utilizzata da ogni funzione app.get() per questi URLs.

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

L'applicazione Node.js gestisce l'instradamento /myProfile e recupera le informazioni impostate nella sessione dal metodo passport.authenticate(), come indicato di seguito.

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);
      })
});

Dopo aver inizializzato l'oggetto UserManager, l'handler dell'instradamento /myProfile utilizza la funzione IdcsUserManager.getUser() dell'SDK per recuperare un oggetto JSON che rappresenta il profilo utente. L'applicazione invia l'oggetto JSON al file myProfile.handlebars per la visualizzazione nel browser Web.

Per disconnettere l'utente da Single Sign-On tra l'applicazione e Oracle Identity Cloud Service, l'applicazione Web Node.js implementa l'instradamento /logout, come descritto di seguito.

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

Questo instradamento invalida la sessione dell'applicazione, rimuove tutti i cookie impostati in precedenza e reindirizza il browser Web dell'utente all'URL di logout OAuth di Oracle Identity Cloud Service. Questo URL è impostato nell'oggetto di configurazione JSON.