Rafraîchissement adaptatif des jetons
Introduction
La spécification OAuth décrit un flux de jetons de rafraîchissement qui permet à une application d'utiliser un jeton de rafraîchissement à longue durée de vie pour obtenir un nouvel ensemble de jetons lorsque le jeton d'accès à courte durée de vie a expiré.
Ce flux peut être utilisé au cours d'une session d'application active si le jeton d'accès associé expire.
Ce flux peut également être utilisé pour créer une nouvelle session d'application à partir d'un jeton de rafraîchissement stocké.
Lors de l'exécution du flux de rafraîchissement des jetons pour une application configurée pour une authentification basée sur une stratégie, cette dernière peut refuser l'accès ou exiger une authentification supplémentaire.
Ce guide montre comment gérer ce flux pour une application NodeJS à l'aide du SDK Adaptive Proxy.
Prérequis
Pour exécuter le flux de ce guide, vous devez disposer d'une application configurée pour l'authentification basée sur des règles et intégrée à Adaptive Access. Cette question est abordée dans la section "On-boarding" d'une application native.
Le code présenté dans ce guide est un ajout à l'application NodeJS décrite à la section Mettre en place un exemple d'application.
Si vous souhaitez montrer à l'utilisateur l'actualisation complète (lorsqu'une nouvelle session est créée), vous devez avoir suivi le guide Exécution d'un rappel pour mettre en place la logique de collecte dans l'exemple d'application.
Activer l'application pour le flux de rafraîchissement adaptatif
Dans cette section, vous allez activer les jetons de rafraîchissement pour l'exemple d'application et appliquer des politiques d'accès pour le flux de jetons de rafraîchissement.
Accéder aux paramètres de connexion à l'application
Dans l'interface d'administration de votre locataire IBM Verify, accédez à la page Applications.
Localisez la définition de l'exemple d'application et sélectionnez l'icône Paramètres.
Dans la définition de l'application, sélectionnez l'onglet Sign-on.

Naviguer vers les paramètres de connexion
Activer les jetons de rafraîchissement dans les paramètres de connexion
Activez la case à cocher Générer un jeton de rafraîchissement pour permettre la génération de jetons de rafraîchissement et pour activer le flux de jetons de rafraîchissement.
Appliquer des politiques d'accès pour rafraîchir le flux de jetons
Par défaut, les règles d'authentification basées sur une politique ne sont pas appliquées aux flux de jetons de rafraîchissement. Cela signifie que l'accès adaptatif n'est pas invoqué pour ce flux.
Localisez le paramètre Apply access policy to API grant types (Appliquer la politique d'accès aux types de subventions API ) et activez la case à cocher Refresh token (Actualiser le jeton).
Enregistrez la définition de l'application mise à jour.

Activer le flux de jetons de rafraîchissement adaptatif
Ajouter le code de rafraîchissement à l'exemple d'application
Dans l'exemple d'application, ajoutez le code suivant à la fin du fichier index.js. Ce code crée un flux de jetons de rafraîchissement à l'aide du SDK Adaptive Proxy.
Notez la réutilisation du code
La fonction handleEvaluateResult, qui existe déjà pour gérer la réponse de la fonction evaluatePassword, est réutilisée ici pour gérer la réponse de la fonction de rafraîchissement adaptatif. Il refusera l'accès, autorisera l'accès ou invoquera le 2FA selon les besoins.
// Function that performs Refresh Flow
async function doRefresh(req, res) {
if (!req.session.sessionId || !req.session.refresh_token) {
res.status(400).send("<html>Cannot Refresh</html>");
return
}
// Set up context required for call to Adaptive SDK
var context = {
sessionId: req.session.sessionId,
userAgent: req.headers['user-agent'],
ipAddress: req.ip
};
try {
// Call refresh function
var result = await adaptive.refresh(context, req.session.refresh_token);
handleEvaluateResult(req, res, context, result);
} catch (error) {
console.log(error);
if (error.response.data.messageDescription) {
res.status(403).send({error: error.response.data.messageDescription});
} else {
res.status(403).send({error: error.message});
}
}
delete req.session.refresh_token
}
Rafraîchissement en cours de session
En général, une actualisation en cours de session est invoquée par la logique de l'application lorsque le jeton d'accès de la session a expiré. Pour vous permettre de voir le rafraîchissement en action, vous ajouterez un point de terminaison /refresh pour permettre un déclenchement manuel de la fonction de rafraîchissement.
Ajoutez le code suivant à la fin du fichier index.js:
// GET /refresh performs a refresh operation using the refresh token
// that was returned during login and the existing Adaptive SessionId
app.get("/refresh", (req, res) => {
// If no refresh token, redirect for full login
if (!(req.session.token && req.session.token.refresh_token)) {
res.redirect('/login');
return
}
req.session.refresh_token = req.session.token.refresh_token;
doRefresh(req, res);
});
Rafraîchissement de la nouvelle session
Pour exécuter un flux de jetons de rafraîchissement dans une nouvelle session, le SDK du navigateur doit être réexécuté afin de collecter à nouveau les données du navigateur. Cette opération s'effectue selon la logique de recollection décrite dans la section Exécution de la recollection.
En général, une nouvelle session est rafraîchie à l'aide d'un jeton de rafraîchissement crypté provenant d'un stockage sécurisé. Dans cet exemple d'application, le jeton de rafraîchissement doit être fourni en tant que paramètre de chaîne de requête :
/fullrefresh?token=<refresh_token>
Cette pratique n'est pas recommandée pour une application réelle
Présenter le refresh_token dans une chaîne de requête de cette manière n'est pas sûr et n'est pas recommandé pour une application réelle. L'exemple d'application est configuré de cette manière pour permettre d'initier simplement le flux de rafraîchissement complet.
Ajoutez le code suivant à la fin du fichier index.js. Cette opération lancera un flux de collecte mais définira une variable de session de sorte qu'une actualisation soit déclenchée lorsque la collecte sera terminée.
// GET /fullrefresh performs a refresh operation using provided refresh token.
// Browser collection is performed to get fresh adaptive sessionId
app.get("/fullrefresh", async (req, res) => {
if (!(req.query.token)) {
res.status(400).send("<html>Expected ?token=[refresh_token]</html>");
return
}
// Save refresh token to session
req.session.refresh_token = req.query.token;
// Save indicator for post-collection operation
req.session.postcollect = "refresh";
res.redirect('/collect');
});
Tester les flux de rafraîchissement
Démarrer l'application et effectuer la connexion initiale
Lancez l'application modèle mise à jour :
node index.js
Dans un navigateur, connectez-vous à l'application et identifiez-vous. Lorsque la connexion est terminée, l'objet jeton de session s'affiche dans le navigateur :
{
"access_token": "gJduCYHPK0jG7RBiMSiQ3WtGQvxUzpp4GtqTZi8s",
"refresh_token": "gj4490jHIOEIH93jgj239nnv8u48nv4892g8t9hnv29",
"scope": "openid",
"grant_id": "24c6fa4e-dca5-4876-bd24-6b897920d74b",
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InNlcnZlciJ9.eyJhY3IiOi...HAiOiAxNTk5MTAxMzY3fQ.HZ9LE3Hb3GkXD..7sQJFlXoXGP3w",
"token_type": "Bearer",
"expires_in": 7199
}
Effectuer un rafraîchissement en cours de session
Notez les valeurs access_token et refresh_token (afin de savoir si elles ont été modifiées après l'actualisation).
Naviguez jusqu'à /refresh. Cette opération déclenche le rafraîchissement du jeton en cours de session. Après l'actualisation, vous revenez à la page d'accueil et les jetons mis à jour sont affichés.
Rafraîchissement de la nouvelle session
Copiez la valeur du refresh_token affichée sur la page d'accueil dans votre presse-papiers.
Arrêtez et redémarrez l'application modèle pour effacer toutes les données de la session.
Dans le navigateur, lancez le rafraîchissement de la nouvelle session en accédant à l' URL suivante (en remplaçant refresh_token par le jeton de rafraîchissement que vous avez copié ci-dessus).
/fullrefresh?token=refresh_token
L'application vous redirigera vers la page de recollection pour collecter les données actualisées du navigateur. L'identifiant de session est capturé dans la réponse POST et ajouté à la session. La logique de rafraîchissement est invoquée.
Il est probable que, dans cette même session de navigation, le risque d'adaptation soit faible et que votre session soit établie sans nécessiter d'authentification supplémentaire.
Copiez le nouveau refresh_token dans votre presse-papiers.
Ouvrez un nouveau navigateur (idéalement un navigateur différent que vous n'avez pas encore utilisé avec cette application) et naviguez jusqu'à l' URL suivante (en remplaçant à nouveau refresh_token par le jeton de rafraîchissement que vous avez copié ci-dessus).
/fullrefresh?token=refresh_token
Il est probable que, dans cette nouvelle session de navigation, le risque d'adaptation soit élevé et qu'il vous soit demandé de remplir un défi OTP par courrier électronique avant que votre session ne soit établie.
Updated about 1 month ago
