Attribute speichern und auf sie zugreifen

Mit IBM Cloud® App ID können Sie Informationen zu den einzelnen Benutzern Ihrer Anwendung in einem Profil kompilieren. Die Informationen im Profil können darauf beruhen, wie die Benutzer mit Ihrer App interagieren oder von Ihnen in ihrem Auftrag hinzugefügt werden. Wenn Sie diese Informationen speichern, können Sie auf sie zugreifen, um personalisierte Erfahrungen mit Ihrer App für Ihre Benutzer zu erstellen.

Erläuterungen zu Profilen

Ein Benutzerprofil besteht aus allen Informationen zu einem bestimmten Benutzer, die in einem JSON-Objekt kompiliert und von App ID gespeichert werden. Es gibt zwei Arten von Informationen (oder Attributen), die abgerufen und in einem Profil gespeichert werden können: predefined und custom Informationen. Vordefinierte Attribute sind spezifisch für die Identität des Benutzers und werden von einem Identitätsprovider zurückgegeben, wenn sich der Benutzer an der App anmeldet; sie können Informationen wie seinen Name oder sein Alter umfassen. Angepasste Attribute werden verwendet, um zusätzliche Informationen zu den Benutzern zu speichern. Sie können von Ihnen festgelegt oder anhand der Interaktion mit dem Benutzer erfasst werden. Angepasste Attribute können zum Beispiel eine zugeordnete Rolle, eine Vorliebe für bestimmte Lebensmittel oder die Bevorzugung von Gangplätzen im Flugzeug sein.

caption-side=bottom"
App ID benutzerprofile Informationsfluss für Benutzerprofile

Sie können für jeden Benutzer bis zu 100 KB an Informationen speichern.

Wie erhalte ich die Benutzerprofilinformationen?

Es gibt verschiedene Möglichkeiten, wie Sie auf Benutzerinformationen zugreifen können, und verschiedene Gründe, warum Sie dies tun sollten. Der Endpunkt, den Sie aufrufen, kann abhängig von Ihrem Anwendungsfall variieren.

Wenn Sie mit einer API arbeiten müssen, sehen Sie in der folgenden Abbildung und den entsprechenden Informationen, wie die Informationen extrahiert werden.

caption-side=bottom"
App ID benutzerprofil-Endpunktoptionen Endpunktoptionen, die für den Zugriff auf Benutzerinformationen verwendet werden können

/oauth/v4/<tenantID>/token
Nach erfolgreicher Authentifizierung erhalten Sie Zugriffs- und Identitätstoken mit den allgemeinen Benutzerinformationen, z. B. Namen, Bild oder einer E-Mail-Adresse. Zum Hinzufügen weiterer Informationen können Sie mit custom claims-mapping App ID so konfigurieren, dass die Informationen in das Token eingefügt werden, bevor es an Sie zurückgegeben wird.
/oauth/v4/<tenantID>/userinfo
Wenn Sie eine detaillierte Ansicht der Benutzerprofilinformationen benötigen, die von einem Identitätsprovider zurückgegeben werden, können Sie den /userinfo-Endpunkt aufrufen. Es wird empfohlen, diesen Endpunkt nur dann zu verwenden, wenn die Informationen nicht auf das Token abgebildet werden können, da er zusätzliche Netzwerkaufrufe erfordert.
/api/v1/attributes
Wenn Ihre Anwendung das Lesen und Aktualisieren von benutzerdefinierten Profilattributen für einen derzeit angemeldeten Benutzer erfordert, können Sie den Endpunkt '/attributes' verwenden. Der Benutzer möchte zum Beispiel eine Lebensmittelpräferenz aktualisieren.
/management/v4/<tenantID>/users
Wenn Sie Verwaltungsschnittstellen oder -prozesse erstellen, die für mehrere Benutzer gelten können, können Sie die App ID-Verwaltungs-API verwenden. Insbesondere können Sie den Endpunkt /users verwenden.

Die einfachste Möglichkeit, mit Benutzerinformationen zu arbeiten, ist die Verwendung der GUI oder eines SDK. Mit diesen Optionen werden alle API-Aufrufe im Hintergrund für Sie ausgeführt.

Auf Attribute bei Laufzeit zugreifen

Nach einer erfolgreichen Benutzerauthentifizierung empfängt die App Zugriffs- und Identitätstoken von App ID. Der Service fügt eine Untergruppe von Attributen automatisch in Ihre Zugriffs- und Identitätstoken ein. Wenn die Informationen nicht im Token enthalten sind, können Sie einen der folgenden Endpunkte verwenden, um die Informationen zu suchen.

Auf Endpunkt /userinfo zugreifen

Wenn Sie die Informationen zu Benutzern anzeigen möchten, die von den konfigurierten Identitätsprovidern bereitgestellt werden, können Sie auf die vordefinierten Attribute zugreifen.

  1. Stellen Sie sicher, dass Sie über ein gültiges Zugriffstoken mit dem Bereich openid verfügen. Sie können mithilfe des Endpunkts /introspect überprüfen, ob Ihr Token gültig ist.

  2. Stellen Sie eine Anfrage an den Endpunkt /userinfo. Werden neue Token nicht explizit an das SDK übergeben, verwendet App ID die zuletzt empfangenen Token zum Abrufen und Validieren der Antwort. Die Übergabe eines Identitätstokens ist optional und dient zur Validierung der Antwort.

    GET https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>/userinfo
    Authorization: 'Bearer <accessToken>'
    
    // iOS Swift example
    
    AppID.sharedInstance.userProfileManager.getUserInfo(accessToken: String, identityToken: String?) { (error: Error?, userInfo: [String: Any]?) in guard
       let userInfo = userInfo, err == nil {
          return // an error has occurred
       }
       // retrieved user info successfully
    }
    
    AppID appId = AppID.getInstance();
    
    appId.getUserProfileManager().getUserInfo(accessToken, identityToken, new UserProfileResponseListener() {
       @Override
       public void onSuccess(JSONObject userInfo) {
       // retrieved attribute "name" successfully
       }
    
       @Override
       public void onFailure(UserInfoException e) {
       // exception occurred
       }
    });
    
    let userProfileManager = UserProfileManager(options: options)
    
    let accessToken = req.session[WebAppStrategy.AUTH_CONTEXT].accessToken;
    let identityToken = req.session[WebAppStrategy.AUTH_CONTEXT].identityToken;
    
    // Retrieve user info and validate against the given identity token
    userProfileManager.getUserInfo(accessToken, identityToken).then(function (profile) {
       // retrieved user info successfully
    });
    
    // Retrieve user info without validation
    userProfileManager.getUserInfo(accessToken).then(function (profile) {
    // retrieved user info successfully
    });
    
    // Server-side Swift example
    
    let userProfileManager = UserProfileManager(options: options)
    let accessToken = "<accessToken>"
    let identityToken = "<identityToken>"
    
    // If identity token is provided (recommended approach), response is validated against the identity token
    
    userProfileManager.getUserInfo(accessToken: accessToken, identityToken: identityToken) { (err, userInfo) in guard
       let userInfo = userInfo, err == nil {
       return
       }
    }
    
    // Retrieve the UserInfo without any validation
    
    userProfileManager.getUserInfo(accessToken: accessToken) { (err, userInfo) in guard
       let userInfo = userInfo, err == nil {
       return
       }
    }
    

    Beispielausgabe:

    "sub": "cad9f1d4-e23b-3683-b81b-d1c4c4fd7d4c",
    "name": "John Doe",
    "email": "john.doe@gmail.com",
    "picture": "https://lh3.googleusercontent.com/-XdUIqdbhg/AAAAAAAAI/AAAAAAA/42rbcbv5M/photo.jpg",
    "gender": "male",
    "locale": "en",
    "identities": [
       {
             "provider": "google",
             "id": "104560903311317789798",
             "profile": {
                "id": "104560903311317789798",
                "email": "john.doe@gmail.com",
                "verified_email": true,
                "name": "John Doe",
                "given_name": "John",
                "family_name": "Doe",
                "link": "https://plus.google.com/104560903311317789798",
                "picture": "https://lh3.googleusercontent.com/-XdUIqdbhg/AAAAAAAAI/AAAAAAA/42rbcbv5M/photo.jpg",
                "gender": "male",
                "locale": "en",
                "idpType": "google"
             }
       }
    ]
    
  3. Stellen Sie sicher, dass der Claim sub genau mit dem Claim sub im Identitätstoken übereinstimmt. Verwenden Sie die zurückgegebenen Informationen nicht, wenn diese Claims nicht übereinstimmen. Weitere Informationen zur Token-Substitution finden Sie in der OIDC-Spezifikation.

Wenn Änderungen von einem externen Identitätsprovider vorgenommen werden, erhalten Sie die aktualisierten Informationen bei der nächsten Anmeldung der Benutzer. Ihre neuen Token rufen die aktuellen Daten ab.

Auf Endpunkt /attributes zugreifen

Abhängig von Ihrer Konfiguration werden Attribute verschlüsselt und als Teil eines Benutzerprofils gespeichert, wenn ein Benutzer mit Ihrer Anwendung interagiert. Die Interaktion könnte durch einen Benutzer erfolgen, der sich anmeldet oder eine Benutzervorgabe in Ihrer App festlegt. Übergeben Sie für den Zugriff auf die Attribute ein Zugriffstoken über eine API-Methode.

curl -X GET 'https://<region>.appid.cloud.ibm.com/api/v1/attributes'
-H 'Accept: application/json'
-H 'Authorization: Bearer <accessToken>'
//iOS Swift example

func setAttribute(key: String, value: String, completionHandler: @escaping(Error?, [String:Any]?) -> Void)
func setAttribute(key: String, value: String, accessTokenString: String, completionHandler: @escaping(Error?, [String:Any]?) -> Void)

func getAttribute(key: String, completionHandler: @escaping(Error?, [String:Any]?) -> Void)
func getAttribute(key: String, accessTokenString: String, completionHandler: @escaping(Error?, [String:Any]?) -> Void)

func getAttributes(completionHandler: @escaping(Error?, [String:Any]?) -> Void)
func getAttributes(accessTokenString: String, completionHandler: @escaping(Error?, [String:Any]?) -> Void)

func deleteAttribute(key: String, completionHandler: @escaping(Error?, [String:Any]?) -> Void)
func deleteAttribute(key: String, accessTokenString: String, completionHandler: @escaping(Error?, [String:Any]?) -> Void)
void setAttribute(@NonNull String name, @NonNull String value, UserAttributeResponseListener listener);
void setAttribute(@NonNull String name, @NonNull String value, @NonNull AccessToken accessToken, UserAttributeResponseListener listener);

void getAttribute(@NonNull String name, UserAttributeResponseListener listener);
void getAttribute(@NonNull String name, @NonNull AccessToken accessToken, UserAttributeResponseListener listener);

void deleteAttribute(@NonNull String name, UserAttributeResponseListener listener);
void deleteAttribute(@NonNull String name, @NonNull AccessToken accessToken, UserAttributeResponseListener listener);

void getAllAttributes(@NonNull UserAttributeResponseListener listener);
void getAllAttributes(@NonNull AccessToken accessToken, @NonNull UserAttributeResponseListener listener);
const userProfileManager = require("ibmcloud-appid").UserProfileManager;
userProfileManager.init();
var accessToken = req.session[WebAppStrategy.AUTH_CONTEXT].accessToken;

// get all attributes
userProfileManager.getAllAttributes(accessToken).then(function (attributes) {

        });

// get single attribute
userProfileManager.getAttribute(accessToken, name).then(function (attributes) {

        });

// set attribute value
userProfileManager.setAttribute(accessToken, name, value).then(function (attributes) {

        });

// delete attribute
userProfileManager.deleteAttribute(accessToken, name).then(function () {

        });
//Server-side Swift example

func getAllAttributes(accessToken: String, completionHandler: (Swift.Error?, [String: Any]?) -> Void)
func getAttribute(accessToken: String, attributeName: String, completionHandler: (Swift.Error?, [String: Any]?) -> Void)
func setAttribute(accessToken: String, attributeName: String, attributeValue : "abc", completionHandler: (Swift.Error?, [String: Any]?) -> Void)
func deleteAllAttributes(accessToken: String, completionHandler: (Swift.Error?, [String: Any]?) -> Void)

Angepasste Attribute festlegen

Sie können zum Profil der Benutzer durch Festlegen eines angepassten Attributs Informationen wie eine Rolle oder Vorgabe hinzufügen. Zum Festlegen angepasster Attribute, bevor ein Benutzer sich bei Ihrer Anwendung anmeldet, lesen Sie die Informationen im Abschnitt Zukünftige Benutzer vorab registrieren.

Angepasste Attribute können standardmäßig geändert werden und können mit einem App ID-Zugriffstoken von einer Clientanwendung aus aktualisiert werden. Ohne geeignete Vorsichtsmaßnahmen kann entweder der Benutzer oder die Anwendung angepasste Attribute unmittelbar nach der ersten Benutzeranmeldung aktualisieren, wenn sie über ein Zugriffstoken verfügen. Dies kann zu unbeabsichtigten Folgen führen. Ein Benutzer könnte beispielsweise seine Rolle von 'Benutzer' in 'Administrator' ändern. Dadurch könnten Administratorberechtigungen in die falschen Hände gelangen.

  1. Wechseln Sie zur Registerkarte Benutzerprofile > Einstellungen im App ID-Dashboard.

  2. Legen Sie für angepasste Attribute die Einstellung Aktiviert fest.

  3. Beziehen Sie Zugangs- und Identitäts-Tokens mit der API.

    1. Rufen Sie Ihre Tenant-ID und Ihre Client-ID, den geheimen Schlüssel und die OAuth-Server-URL von Ihren Berechtigungsnachweisen ab.

    2. Verschlüsseln Sie die Client-ID und den geheimen Schlüssel mithilfe eines Base64-Encoders.

    3. Orientieren Sie sich an den folgenden Codebeispielen, um Ihr Token abzurufen. Welchen Bewilligungstyps Sie zum Abrufen des Tokens verwenden, richtet sich nach dem Typ der jeweils verwendeten Autorisierung. Eine detaillierte Liste der Optionen finden Sie in der Swagger-Dokumentation.

      curl -X POST 'https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>/token' \
      -H 'Authorization: Basic base64Encoded{<clientID>:<clientSecret>}' \
      -H 'Accept: application/json' \
      -F 'grant_type=password' \
      -F 'username=testuser@test.com' \
      -F 'password=testuser'
      
      // iOS Swift example
      
      class delegate : TokenResponseDelegate {
         public func onAuthorizationSuccess(accessToken: AccessToken?, identityToken: IdentityToken?, refreshToken: RefreshToken?, response:Response?) {
         //User authenticated
         }
      
         public func onAuthorizationFailure(error: AuthorizationError) {
         //Exception occurred
         }
      }
      
      AppID.sharedInstance.signinWithResourceOwnerPassword(username: username, password: password, delegate: delegate())
      
      AppID.getInstance().signinWithResourceOwnerPassword(getApplicationContext(), username, password, new TokenResponseListener() {
         @Override
         public void onAuthorizationFailure (AuthorizationException exception) {
            //Exception occurred
         }
      
         @Override
         public void onAuthorizationSuccess (AccessToken accessToken, IdentityToken identityToken, RefreshToken refreshToken) {
            //User authenticated
         }
      });
      
      // Declare the API you want to protect
      app.get("/api/protected",
      
         passport.authenticate(APIStrategy.STRATEGY_NAME, {
         session: false
         }),
         function(req, res) {
         // Get full appIdAuthorizationContext from request object
         var appIdAuthContext = req.appIdAuthorizationContext;
      
         appIdAuthContext.accessToken; // Raw access_token
         appIdAuthContext.accessTokenPayload; // Decoded access_token JSON
         appIdAuthContext.identityToken; // Raw identity_token
         appIdAuthContext.identityTokenPayload; // Decoded identity_token JSON
         appIdAuthContext.refreshToken; // Raw refresh_token
         ...
         }
      );
      
      // Server-side swift example
      
      let options = [
         "clientId": "<clientID>",
         "secret": "<secret>",
         "tenantId": "<tenantID>",
         "oauthServerUrl": "<oauthServerURL>",
         "redirectUri": "<appURL>" + CALLBACK_URL
      ]
      let webappKituraCredentialsPlugin = WebAppKituraCredentialsPlugin(options: options)
      let kituraCredentials = Credentials()
      kituraCredentials.register(plugin: webappKituraCredentialsPlugin)
      
  4. Verwenden Sie den Endpunkt attributes und stellen Sie damit eine PUT-Anforderung.

    curl -X PUT "https://<region>.appid.cloud.ibm.com/api/v1/attributes/<attributeName>" \
    -H "Authorization: Bearer <token>" \
    -d "<attributeValue>"
    
    // iOS Swift example
    
    AppID.sharedInstance.userProfileManager?.setAttribute("key", "value") { (error, result) in
       guard let result = result, error == nil else {
          return // an error has occurred
       }
    // attributes recieved as a Dictionary
    })
    
    appId.getUserProfileManager().setAttribute(name, value, useThisToken, new UserProfileResponseListener() {
       @Override
       public void onSuccess(JSONObject attributes) {
       // attributes received in JSON format on successful response
       }
    
       @Override
       public void onFailure(UserAttributesException e) {
       // exception occurred
       }
    });
    
    const userProfileManager = require("ibmcloud-appid").UserProfileManager;
    userProfileManager.init();
    
    var accessToken = req.session[WebAppStrategy.AUTH_CONTEXT].accessToken;
    
    userProfileManager.setAttribute(accessToken, name, value).then(function (attributes) {
       // attributes returned as dictionary
    });
    
    // Server-side Swift
    
    let userProfileManager = UserProfileManager(options: options)
    let accesstoken = "access token"
    
    userProfileManager.setAttribute(accessToken: accessToken, attributeName: "name", attributeValue : "abc") { (error, response) in
       guard let response = response, error == error else {
       return // an error has occurred
       }
       // attributes received as a Dictionary
    }