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.
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.
/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
/usersverwenden.
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.
-
Stellen Sie sicher, dass Sie über ein gültiges Zugriffstoken mit dem Bereich
openidverfügen. Sie können mithilfe des Endpunkts/introspectüberprüfen, ob Ihr Token gültig ist. -
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" } } ] -
Stellen Sie sicher, dass der Claim
subgenau mit dem Claimsubim 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.
-
Wechseln Sie zur Registerkarte Benutzerprofile > Einstellungen im App ID-Dashboard.
-
Legen Sie für angepasste Attribute die Einstellung Aktiviert fest.
-
Beziehen Sie Zugangs- und Identitäts-Tokens mit der API.
-
Rufen Sie Ihre Tenant-ID und Ihre Client-ID, den geheimen Schlüssel und die OAuth-Server-URL von Ihren Berechtigungsnachweisen ab.
-
Verschlüsseln Sie die Client-ID und den geheimen Schlüssel mithilfe eines Base64-Encoders.
-
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)
-
-
Verwenden Sie den Endpunkt
attributesund 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 }