Informationen zur Authentifizierung zwischen Node.js -Anwendungen und Oracle Identity Cloud Service

Sie möchten sich mit der Authentifizierung zwischen Node.js -Webanwendungen und Oracle Identity Cloud Service vertraut machen. Dies umfasst die folgenden Kenntnisse:

  • Der dreibeinige Authentifizierungsflow, den Oracle Identity Cloud Service für das Node.js -SDK unterstützt

  • Anwendungsfälle für die Verwendung eines SDK mit einer Node.js -Anwendung zur Authentifizierung mit Oracle Identity Cloud Service

  • Methoden und Funktionen des Node.js -SDK

Informationen zu überlappenden Authentifizierungsflüssen

Oracle Identity Cloud Service unterstützt den dreibeinigen Authentifizierungs-Flow für das Node.js -SDK. In diesem Ablauf interagieren Benutzer direkt mit Oracle Identity Cloud Service. Nachdem sich ein Benutzer angemeldet hat, gibt Oracle Identity Cloud Service einen Autorisierungscode aus, den das SDK für ein Benutzerzugriffstoken austauscht. Die Node.js -Webanwendung verwendet dieses Zugriffstoken, um Benutzern Zugriff auf die geschützten Ressourcen in der Anwendung zu erteilen. Der dreibeinige Flow verwendet den Berechtigungscodeerteilungstyp.

Für höhere Sicherheit empfiehlt Oracle, dass Sie den dreibeinigen Fluss verwenden, um Ihre Node.js -Webanwendungen mit Oracle Identity Cloud Service zur Authentifizierung zu integrieren. Wenn Sie den Berechtigungstyp für den Autorisierungscode verwenden, können Sie auch auf andere Anwendungen zugreifen, die von Oracle Identity Cloud Service geschützt sind, ohne sich erneut authentifizieren zu müssen.

Weitere Informationen zu den primären Anwendungsfällen für die Verwendung eines SDK mit einer Node.js -Anwendung

Die Node.js -Webanwendung implementiert zwei Anwendungsfälle: einen für die Authentifizierung von Benutzern und den anderen für den Zugriff auf detaillierte Informationen über den angemeldeten Benutzer.

In den folgenden Datenflussdiagrammen wird der Fluss von Ereignissen, Aufrufen und Antworten zwischen dem Webbrowser, der Webanwendung und Oracle Identity Cloud Service für jeden Anwendungsfall dargestellt.

Anwendungsfall #1: Benutzer authentifizieren

Der Datenfluss wird wie folgt ausgeführt:

  1. Der Benutzer benötigt eine geschützte Ressource.

  2. Das Authentifizierungsmodul verwendet das SDK, um eine request-authorization-code-URL für Oracle Identity Cloud Service zu generieren und diese URL als Umleitungsantwort an den Webbrowser zu senden.

  3. Der Webbrowser ruft die URL auf.

  4. Die Anmeldeseite für Oracle Identity Cloud Service wird angezeigt.

  5. Der Benutzer leitet seine Zugangsdaten für die Oracle Identity Cloud Service -Anmeldung weiter.

  6. Nachdem sich der Benutzer angemeldet hat, erstellt Oracle Identity Cloud Service eine Session für den Benutzer und gibt einen Autorisierungscode aus.

  7. Die Webanwendung erstellt einen Backend- (oder Server-zu-Server-) Aufruf zum Austausch des Autorisierungscodes für ein Benutzerzugriffstoken.

  8. Oracle Identity Cloud Service gibt das Zugriffstoken aus.

  9. Eine Session wird hergestellt, und der Benutzer wird auf die Homepage umgeleitet.

  10. Die Homepage der Webanwendung wird angezeigt.

Anwendungsfall #2: Details zum Benutzer abrufen

Der Datenfluss wird wie folgt ausgeführt:

  1. Der Benutzer fordert die /myProfile -Ressource an.

  2. Die Webanwendung ruft Oracle Identity Cloud Service mit dem SDK auf, das das Zugriffstoken verwendet, das in der Benutzersession als Parameter gespeichert ist.

  3. Die Benutzerdetails werden als JSON-Objekt an die Webanwendung gesendet.

  4. Auf der Seite "Mein Profil " wird das JSON-Objekt als HTML-Inhalt wiedergegeben.

Weitere Informationen zu Methoden und Funktionen

Das Node.js -SDK ist eine Node.js -Ort-Strategie, die Sie dem Node.js modules -Ordner hinzufügen. Dieses SDK basiert auch auf Node.js -SZusagen. Alle Abhängigkeiten von Drittanbietern, die das Node.js -SDK benötigt, werden in der SDK-Datei package.json definiert. Sie müssen mindestens dieses Set von Modulen in der Node.js -Webanwendung verwenden.

"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"
  },

Eine Node.js -Webanwendung wurde mit den Modulen Node.js express und express-handlebars entwickelt, die URL-Routen in Form einer app.get() -Funktion für jede URL implementiert.

Das Node.js -SDK erfordert eine JSON-Variable, die mit Oracle Identity Cloud Service -Verbindungsinformationen geladen wird. Die Node.js -Webanwendung verwendet die Variable ids zur Speicherung dieser Informationen:

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;

Im Folgenden finden Sie eine kurze Erläuterung jedes erforderlichen Attributs für dieses SDK:

Name Beschreibung
ClientId Der Wert der Client-ID, die generiert wird, nachdem Sie die Node.js -Webanwendung in der Identity Cloud Service -Konsole registriert haben.
ClientSecret Der Wert des Client Secret, das generiert wird, nachdem Sie die Node.js -Webanwendung in der Identity Cloud Service -Konsole registriert haben.
ClientTenant Das Domainpräfix Ihrer Oracle Identity Cloud Service -Instanz. Dieses Präfix ähnelt normalerweise idcs-abcd1234.
IDCSHost Das Domainsuffix der Oracle Identity Cloud Service -Instanz. Zur Laufzeit wird der Platzhalter %tenant% durch den Wert des Attributs ClientTenant ersetzt.
AudienceServiceUrl Die vollständige Domain-Name-URL der Oracle Identity Cloud Service -Instanz.
TokenIssuer Für dieses Attribut empfiehlt Oracle, dass Sie den Wert https://identity.oraclecloud.com/ beibehalten.
scope

Der Geltungsbereich steuert die Daten, auf die die Anwendung zugreifen oder sie für den Oracle Identity Cloud Service -Benutzer verarbeiten kann.

Wenn die Anwendung das SDK zur Authentifizierung eines Benutzers verwendet, lautet der Geltungsbereich openid. Wenn die Anwendung das SDK verwendet, um Details zu dem Benutzer abzurufen, ist der Geltungsbereich urn:opc:idm:t.user.me openid.

Die Anwendung verwendet sowohl die Attribute logoutSufix als auch redirectURL. Das SDK erfordert sie nicht.

Die Node.js -Anwendung implementiert die /oauth/oracle -URL-Route. Wenn ein Benutzer sich für die Authentifizierung mit Oracle Identity Cloud Service entscheidet, fordert der Webbrowser eine Anforderung an diese URL an. Diese Weiterleitung verwendet das SDK, um die Autorisierungs-URL von Oracle Identity Cloud Service zu generieren.

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

Diese Funktion lädt die JSON-Parameter in eine Variable, initialisiert einen Authentication Manager und verwendet die Funktion IdcsAuthenticationManager.getAuthorizationCodeUrl() des Node.js -SDK, um die Autorisierungscode-URL zu generieren. Mit dieser Funktion wird der Webbrowser des Benutzers entweder umgeleitet, wenn die Autorisierungscode-URL generiert wird oder ein Fehler im Browser wiedergegeben wird.

Die folgenden Parameter werden zum Generieren der Autorisierungscode-URL verwendet:

Name Beschreibung
auth.oracle.redirectURL Nachdem sich ein Benutzer angemeldet hat, leitet Oracle Identity Cloud Service den Webbrowser des Benutzers an diese URL um. Diese URL muss mit der URL übereinstimmen, die Sie für die vertrauenswürdige Anwendung in der Identity Cloud Service -Konsole konfigurieren. Weitere Informationen über die Angabe einer Umleitungs-URL für die Node.js -Webanwendung finden Sie unter Node.js -Anwendung registrieren.
auth.oracle.scope Der Geltungsbereich von OAuth oder OpenID Connect der Authentifizierung. Diese Anwendung erfordert nur die openid -Authentifizierung.
state Das OAuth -Protokoll definiert diesen Parameter. Die Node.js -Beispielanwendung verwendet diesen Code, um zu prüfen, ob eine Kommunikation mit Oracle Identity Cloud Service aufgebaut werden kann. In diesem Beispiel ist der Wert für diesen Parameter 1234.
response_type Der für den Berechtigungscodeerteilungstyp erforderliche Parameter. In diesem Beispiel ist der Wert für diesen Parameter code.

Nach der Anmeldung des Benutzers leitet Oracle Identity Cloud Service den Webbrowser des Benutzers zu einer Callback-URL um, die der Entwickler implementieren muss. Die Node.js -Webanwendung verwendet die /callback -Route zur Verarbeitung dieser Anforderung.

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

Die Node.js -Anwendung verwendet den Autorisierungscode, um ein Zugriffstoken anzufordern. Das Zugriffstoken wird als Cookie gespeichert und dann zur zukünftigen Verwendung an den Webbrowser gesendet.

Die IdcsAuthenticationManager.authorizationCode() -Funktion des Node.js -SDK verwendet ebenfalls promise (eine Then-catch-Anweisung), um das Zugriffstoken als Cookie festzulegen und den Browser an die /auth.html -Seite umzuleiten.

Das Node.js -SDK basiert auf dem Node.js passport-Framework. Daher müssen Sie das Zugriffstoken als Headervariable an den /auth -URL-Handler weiterleiten und die passport.authenticate() -Methode mit dem Oracle Identity Cloud Service -Stratennamen als Parameter verwenden:

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

Nachdem die passport.authenticate() -Methode die Session der Anwendung erstellt hat, leitet die Funktion den Webbrowser des Benutzers an eine geschützte URL in der /home -Anwendung um. Zusätzlich zu /home verfügt die Node.js -Webanwendung über drei andere geschützte URLs: /appDetails, /userInfo und /myProfile.

Jede geschützte URL muss prüfen, ob die Session des Benutzers vorher erstellt wurde. Die folgende Funktion wird von jeder app.get() -Funktion für diese URLs verwendet.

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

Die Node.js -Anwendung verarbeitet die /myProfile -Route und ruft Informationen ab, die von der passport.authenticate() -Methode in der Session festgelegt wurden, wie folgt:

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

Nach dem Initialisieren des UserManager -Objekts verwendet der /myProfile -Weiterleitungs-Handler die SDK-Funktion IdcsUserManager.getUser(), um ein JSON-Objekt abzurufen, das das Benutzerprofil darstellt. Die Anwendung sendet das JSON-Objekt zur Wiedergabe im Webbrowser an die myProfile.handlebars -Datei.

Um den Benutzer von Single Sign-On zwischen der Anwendung und Oracle Identity Cloud Service abzumelden, implementiert die Node.js -Webanwendung die /logout -Route wie folgt:

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

Diese Weiterleitung invalidiert die Anwendungssession, entfernt alle zuvor festgelegten Cookies und leitet den Webbrowser des Benutzers zur OAuth-Abmelde-URL von Oracle Identity Cloud Service um. Diese URL ist im JSON-Konfigurationsobjekt eingerichtet.