1

J'utilise l'authentification par adaptateur pour protéger les ressources et gérer l'ensemble de la logique d'authentification (validation des informations d'identification). Si la validation utilisateur/mot de passe réussit, la méthode WL.Server.setActiveUser est appelée pour créer une session authentifiée pour le domaine, avec les données utilisateur stockées dans un objet userIdentity.IBM MobileFirst Platform Foundation 7 - Authentification de l'adaptateur - Mise à jour des attributs d'identité utilisateur

Le processus de validation utilisateur/mot de passe renvoie OK/Échec et également un cookie si la validation a réussi. Et ce cookie doit être envoyé sur les appels d'adaptateur suivants, donc je l'ajoute également dans l'objet de données userIdentity. Mon idée était de le stocker dans l'objet userIdentity, car il peut être récupéré sur les autres adaptateurs (var userIdentity = WL.Server.getActiveUser();) pour ajouter la valeur de cookie dans l'en-tête de demande de l'adaptateur et cela fonctionne correctement!

Quel est le problème? La réponse de l'adaptateur peut contenir une nouvelle valeur pour ce cookie, donc je devrais mettre à jour l'objet userIdentity pour remplacer l'ancienne valeur du cookie par la nouvelle valeur. Néanmoins, l'objet userIdentity est immuable, de sorte qu'il contient toujours le cookie d'origine que le processus de connexion a reçu.

Existe-t-il un moyen de mettre à jour l'objet userIdentity? Sinon, comment puis-je gérer une table mutable pour enregistrer et mettre à jour un cookie lié à chaque session utilisateur afin de l'envoyer sur la requête de l'adaptateur au Backend?

Existe-t-il un meilleur moyen de gérer ce cookie de backend requis pour chaque demande d'adaptateur utilisateur?

Merci beaucoup! Sergi

PS: Il y a une question qui tente de résoudre cela, mais la réponse possible est pas valable pour moi (IBM MobileFirst Platform Foundation 6.3: Can we edit the custom attributes of User Identity Object [MobileFirst Session]): J'ai essayé le code suivant pour la mise à jour du UserIdentity:

var newUserIdentity = { 
     userId: userIdentity.userId, 
     attributes: { 
      cookies: newValue 
     } 
}; 
WL.Server.setActiveUser(realm, null); 
WL.Server.setActiveUser(realm, newUserIdentity); 

Mais quand il est récupéré d'un autre adaptateur (var userIdentity = WL.Server.getActiveUser()), il contient la valeur d'origine!

+0

Pourquoi la question liée n'est-elle pas valide pour vous? –

+0

Une explication est ajoutée à la question. – sergi

+0

J'ai essayé de gérer le cookie directement, mais n'a pas réussi https://stackoverflow.com/questions/28753979/mobilefirst-http-adapter-delete-update-back-end-cookie-value – xverges

Répondre

1
  1. Vous pouvez supprimer le UserIdentity (WL.Server.setActiveUser("realm", null);), puis définissez un nouvel objet utilisateur actif.

  2. Si vous pouvez dépendre des sessions HTTP (serveur unique ou sessions persistantes), vous pouvez accéder à l'objet session et stocker ce que vous voulez. (WL.Server.getClientRequest().getSession())

  3. Si vous ne souhaitez pas utiliser les sessions HTTP, vous pouvez utiliser un mécanisme de stockage externe tel que SQL ou Cloudant pour stocker ces informations. Vous pouvez utiliser l'ID client comme identificateur (voir l'exemple https://ibm.biz/BdXUHt).

+0

Merci Nathan! 1) Cela ne me semble pas fonctionner, j'ai ajouté le code que j'ai utilisé pour le tester à la fin de ma question. 2) Pouvez-vous partager un lien avec un échantillon? Voulez-vous faire chaque appel d'adaptateur en utilisant la classe 'org.apache.http.client.methods.HttpGet'? Je voulais garder les adaptateurs simples, en utilisant 'WL.Server.invokeHttp (input)'. 3) J'espère que les options précédentes empêchent d'utiliser un mécanisme de stockage externe. – sergi

+0

Je n'ai pas d'exemple pour (2), mais vous pouvez obtenir l'objet de session en utilisant 'WL.Server.getClientRequest(). GetSession()', puis sur cet objet vous pouvez faire 'setAttribute' et' getAttribute' . –

+0

Merci, je vais essayer cette solution! – sergi