Anwendungsidentität und Autorisierung

Bei IBM Cloud® App ID können Sie Anwendungen mithilfe der Anwendungsidentität und des Autorisierungsablaufs durch Einsatz der OAuth 2.0-Funktionalität schützen.

Informationen zum Kommunikationsablauf

Es gibt mehrere Gründe, warum eine Anwendung ohne Benutzereingriff mit einem anderen Service oder einer anderen App kommunizieren soll. Beispiel: Eine nicht interaktive App, die auf eine andere Anwendung zugreifen muss, um ihre Arbeit auszuführen. Dies kann Prozesse, CLIs, Dämonen oder ein IoT-Gerät umfassen, das Umgebungsvariablen auf einem Upstream-Server überwacht und meldet. Der jeweilige Anwendungsfall ist für jede Anwendung spezifisch. Zu beachten ist aber, dass die Anforderungen im Auftrag der App ausgetauscht werden, nicht im Auftrag eines Endbenutzers, und es ist die App, die authentifiziert und autorisiert wird.

Wie funktioniert der Ablauf?

App ID nutzt den Ablauf für OAuth 2.0-Clientberechtigungsnachweise, um die Kommunikation zu schützen. Wenn eine App bei App ID registriert wurde, ruft die App eine Client-ID und einen geheimen Schlüssel ab. Mit diesen Informationen kann die App ein Zugriffstoken von App ID anfordern und für den Zugriff auf eine geschützte Ressource oder API autorisiert werden. In dem Ablauf für Anwendungsidentität und Autorisierung wird der Anwendung nur ein Zugriffstoken erteilt. Sie erhält weder ein Identitätstoken noch ein Aktualisierungstoken. Weitere Informationen zu Token finden Sie unter Informationen zu Token.

Dieser Arbeitsablauf sollte nur mit vertrauenswürdigen Anwendungen verwendet werden, bei denen kein Risiko besteht, dass das Geheimnis missbraucht wird oder durchsickert. Die Anwendung ist immer im Besitz des geheimen Clientschlüssels. Dies funktioniert nicht bei mobilen Apps.

Wie sieht der Ablauf aus?

In der folgenden Abbildung sehen Sie die Richtung der Kommunikation zwischen dem Service und Ihrer Anwendung.

caption-side=bottom"
App ID fluss der Anwendungsidentität und -berechtigung Fluss der Anwendungsidentität und -berechtigung

  1. Sie registrieren die Anwendung, für die eine Authentifizierung erforderlich ist, um mit App ID auf eine geschützte Ressource zuzugreifen.
  2. Anwendung A registriert sich bei App ID, um eine Client-ID und einen geheimen Schlüssel zu erhalten.
  3. Von Anwendung A wird durch Senden der im vorherigen Schritt abgerufenen Berechtigungsnachweise eine Anforderung an den Endpunkt /token des App ID-Autorisierungsservers gestellt.
  4. App ID validiert die Anforderung, authentifiziert die App und gibt eine Antwort an Anwendung A zurück, die ein Zugriffstoken enthält.
  5. Anwendung A kann jetzt das gültige Zugriffstoken verwenden, um Anforderungen an geschützte Ressourcen wie Anwendung B zu senden.

Der geheime Clientschlüssel, der zum Authentifizieren des Clients verwendet wird, enthält sehr sensible Daten und muss vertraulich behandelt werden. Da die Anwendung das Client-Geheimnis in der Anwendung verwendet, darf dieser Workflow nur mit vertrauenswürdigen Anwendungen verwendet werden. Durch die Verwendung einer vertrauenswürdigen Anwendung wird sichergestellt, dass der geheime Clientschlüssel nicht missbraucht wird oder in falsche Hände gerät.

App registrieren

Mit der GUI

  1. Klicken Sie auf der Registerkarte Anwendung im App ID-Dashboard auf Anwendung hinzufügen.
  2. Fügen Sie Ihren Anwendungsnamen hinzu und klicken Sie auf Speichern, um zu einer Liste Ihrer registrierten Apps zurückzukehren. Der Name Ihrer Anwendung darf nicht mehr als 50 Zeichen lang sein.
  3. Wählen Sie in der Liste der registrierten Apps die Anwendung aus, die Sie im vorherigen Schritt hinzugefügt haben. Die erweiterte Zeile zeigt Ihre Berechtigungsnachweise an.

Mit der API

  1. Erstellen Sie eine POST-Anforderung an den /management/v4/<tenantID>/applications-Endpunkt.

    curl -X POST \  https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/ \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer <IAMToken>' \
    -d '{"name": "<applicationName>"}'
    

    Beispielantwort:

    {
    "clientId": "c90830bf-11b0-4b44-bffe-9773f8703bad",
    "tenantId": "b42f7429-fc24-48fa-b4f9-616bcc31cfd5",
    "secret": "YWQyNjdkZjMtMGRhZC00ZWRkLThiOTQtN2E3ODEyZjhkOWQz",
    "name": "testing",
    "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/b42f7429-fc24-48fa-b4f9-616bcb31cfd5",
    "profilesUrl": "https://us-south.appid.cloud.ibm.com",
    "discoveryEndpoint": "https://us-south.appid.cloud.ibm.com/oauth/v4/b42f7429-fc24-48fa-b4f9-616bcb31cfd5/.well-known/openid-configuration"
    }
    

Zugriffstoken abrufen

Nachdem Ihre App bei App ID registriert wurde und Sie Ihre Berechtigungsnachweise erhalten haben, können Sie eine Anforderung an den App ID-Autorisierungsserver stellen, um ein Zugriffstoken anzufordern.

  1. Stellen Sie eine HTTP POST-Anfrage an den Endpunkt /token. Die Autorisierung für die Anforderung ist Basic auth, wobei die Client-ID und der geheime Schlüssel als Benutzername und Kennwort verwendet werden, die Base64-codiert sind.

    curl -X POST https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>/token \
       -H 'Authorization: Basic base64Encoded{clientId:secret}' \
       -H 'Content-Type: application/x-www-form-urlencoded' \
       -d 'grant_type=client_credentials'
    

    Beispielantwort:

    {
    "access_token": "eyJhbGciOiJS...F9A",
    "expires_in": "3600",
    "token_type": "Bearer"
    }
    

Lernprogramm: End-to-End-Ablauf mit dem Node.js-SDK

  1. Verwenden Sie zum Abrufen eines Zugriffstokens eines der folgenden Verfahren:

    • Über das App ID Node.js Server SDK unter Verwendung des Token-Managers. Initialisieren Sie den Token-Manager mit Ihren App-Berechtigungsnachweisen und rufen Sie die Methode getApplicationIdentityToken() auf, um das Token abzurufen.

      const TokenManager = require('ibmcloud-appid').TokenManager;
      const config = {
      clientId: "<clientID>",
      tenantId: "<tenantID>",
      secret: "{secret}",
      oauthServerUrl: "https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>"
      };
      const tokenManager = new TokenManager(config);
      tokenManager.getApplicationIdentityToken().then((appIdAuthContext) => {
      console.log(' Access tokens from SDK : ' + JSON.stringify(appIdAuthContext));
      }).catch((err) => {
      //console.error('Error retrieving tokens : ' + err);
      });
      
    • Über den App ID-Autorisierungsserver.

      Die oauthServerUrl in der Anforderung wird bei der Registrierung Ihrer Anwendung abgerufen. Wenn Sie Ihre App mit den Verwaltungs-APIs registriert haben, befindet sich die Server-URL im Antwortteil. Wenn Sie Ihre App durch Binden an die IBM Cloud-Konsole registriert haben, kann die URL in Ihrem JSON-Objekt VCAP_SERVICES enthalten sein oder über Ihre geheimen Kubernetes-Schlüssel gefunden werden.

      var request = require('request');
      function getAccessToken() {
      let options = {
            method: 'POST',
            url: oauthServerUrl + '/token',
            headers: { 'content-type': 'application/x-www-form-urlencoded',
               'Authorization': 'Basic ' +Buffer.from('clientId: secret').toString('base64')
            },
            form: {
               grant_type: 'client_credentials'
            }
      };
      return new Promise((resolve, reject) => {
            request(options, function (error, response, body) {
               if (error) {
                  return reject(error);
               }
               let data = JSON.parse(body);
               if(data.access_token) {
                  resolve(data.access_token);
               } else {
                  reject(data);
               }
            })
      });
      }
      
  2. Stellen Sie eine Anforderung an Ihre geschützte Ressource, indem Sie das Zugriffstoken verwenden, das Sie im vorherigen Schritt angefordert haben.

    let options = {
       method: 'GET',
       url: 'http://localhost:8081/protected_resource',
       headers: { authorization : 'Bearer ' + accessToken}
    }
    request(options, function (error, response, body) {
       if (error) {
          console.log(error)
       } else {
             res.status(response.statusCode).send({
       console.log(JSON.stringify(body));
             });
       }
    });
    
  3. Sichern Sie Ihre geschützten Ressourcen ab, indem Sie die API-Strategie aus dem App ID-Node.js-SDK verwenden.

    const express = require('express'),
       passport = require('passport');
       APIStrategy = require("ibmcloud-appid").APIStrategy;
    var app = express();
    app.use(passport.initialize());
    passport.use(new APIStrategy({
       oauthServerUrl: "https://{region}.appid.cloud.ibm.com/oauth/v4/{tenant-ID}",
       tenantId:"{tenant-ID}"
    }));
    app.get('/protected_resource',
       passport.authenticate(APIStrategy.STRATEGY_NAME, {session: false}),
       (req, res) => {
             res.send("Hello from protected resource");
    });