Rafraîchissement adaptatif des jetons
Introduction
La spécification OAuth décrit un flux de jeton de rafraîchissement qui permet à une application d'utiliser un jeton de rafraîchissement de longue durée pour obtenir un nouvel ensemble de jetons lorsque le jeton d'accès de courte durée a expiré.
Ce flux peut être utilisé dans 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 jeton de rafraîchissement pour une application configurée pour l'authentification basée sur des politiques, la politique peut refuser l'accès ou exiger une authentification supplémentaire.
Ce guide montre comment gérer ce flux pour une application NodeJS en utilisant l'Adaptive Proxy SDK.
Prérequis
L'exécution du flux dans ce guide nécessite que vous ayez une application configurée pour l'authentification basée sur des politiques et intégrée pour Adaptive Access. Ceci est couvert dans Intégration d'une application native.
Le code montré dans ce guide est un ajout à l'application NodeJS décrite dans Configurer une application exemple.
Si vous voulez montrer l'exploration du rafraîchissement complet (où une nouvelle session est créée), vous devez avoir terminé le guide Effectuer une recollecte pour configurer la logique de collecte dans l'application exemple.
Activer l'application pour le flux de rafraîchissement adaptatif
Dans cette section, vous activerez les jetons de rafraîchissement pour l'application exemple et appliquerez les politiques d'accès pour le flux de jeton de rafraîchissement.
Naviguer vers les paramètres de connexion de l'application
Dans l'interface d'administration de votre locataire IBM Security Verify, naviguez vers la page Applications.
Localisez la définition pour l'application exemple et sélectionnez l'icône Paramètres.
Dans la définition d'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 pour Générer un jeton de rafraîchissement pour activer la génération de jetons de rafraîchissement et pour activer le flux de jeton de rafraîchissement.
Appliquer les politiques d'accès au flux de jeton de rafraîchissement
Par défaut, les règles d'authentification basées sur des politiques ne sont pas appliquées aux flux de jetons de rafraîchissement. Cela signifie qu'Adaptive Access n'est pas invoqué pour ce flux.
Localisez le paramètre Appliquer la politique d'accès aux types d'octroi API et activez la case à cocher pour Jeton de rafraîchissement.
Enregistrez la définition d'application mise à jour.

Activer le flux de jeton de rafraîchissement adaptatif
Ajouter le code de rafraîchissement à l'application exemple
Dans l'application exemple, ajoutez le code suivant à la fin du fichier index.js
. Ce code initie un flux de jeton de rafraîchissement en utilisant l'Adaptive Proxy SDK.
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 refresh adaptative. Elle refusera l'accès, autorisera l'accès, ou invoquera 2FA selon les besoins.
// Fonction qui effectue le flux de rafraîchissement
async function doRefresh(req, res) {
if (!req.session.sessionId || !req.session.refresh_token) {
res.status(400).send("<html>Cannot Refresh</html>");
return
}
// Configurer le contexte requis pour l'appel à l'Adaptive SDK
var context = {
sessionId: req.session.sessionId,
userAgent: req.headers['user-agent'],
ipAddress: req.ip
};
try {
// Appeler la fonction de rafraîchissement
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 session
Habituellement, un rafraîchissement en session serait invoqué par la logique d'application lorsque le jeton d'accès dans 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 effectue une opération de rafraîchissement en utilisant le jeton de rafraîchissement
// qui a été retourné lors de la connexion et l'SessionId adaptatif existant
app.get("/refresh", (req, res) => {
// Si pas de jeton de rafraîchissement, rediriger pour une connexion complète
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 nouvelle session
Pour exécuter un flux de jeton de rafraîchissement dans une nouvelle session, le Browser SDK doit être relancé afin de recollecte les données du navigateur. Ceci est fait en utilisant la logique de recollecte décrite dans Effectuer une recollecte.
Habituellement, un rafraîchissement de nouvelle session serait exécuté en utilisant un jeton de rafraîchissement chiffré tiré du stockage sécurisé. Dans cette application exemple, le jeton de rafraîchissement doit être fourni comme paramètre de chaîne de requête :
/fullrefresh?token=<refresh_token>
Ceci n'est pas une pratique recommandée pour une vraie application
Présenter le refresh_token dans une chaîne de requête de cette façon n'est pas sécurisé et n'est pas recommandé pour toute vraie application. L'application exemple est configurée de cette façon pour permettre un moyen simple d'initier le flux de rafraîchissement complet.
Ajoutez le code suivant à la fin du fichier index.js
. Ceci initiera un flux de collecte mais définira une variable de session pour qu'un rafraîchissement soit déclenché lorsque la collecte est terminée.
// GET /fullrefresh effectue une opération de rafraîchissement en utilisant le jeton de rafraîchissement fourni.
// La collecte du navigateur est effectuée pour obtenir un sessionId adaptatif frais
app.get("/fullrefresh", async (req, res) => {
if (!(req.query.token)) {
res.status(400).send("<html>Expected ?token=[refresh_token]</html>");
return
}
// Sauvegarder le jeton de rafraîchissement dans la session
req.session.refresh_token = req.query.token;
// Sauvegarder l'indicateur pour l'opération post-collecte
req.session.postcollect = "refresh";
res.redirect('/collect');
});
Tester les flux de rafraîchissement
Démarrer l'application et effectuer la connexion initiale
Démarrez l'application exemple mise à jour :
node index.js
Dans un navigateur, connectez-vous à l'application et connectez-vous. Lorsque la connexion est terminée, l'objet jeton de session sera affiché 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 session
Notez les valeurs access_token et refresh_token (pour que vous sachiez qu'elles ont changé après le rafraîchissement).
Naviguez vers /refresh
. Ceci initiera le rafraîchissement de jeton en session. Après le rafraîchissement, vous êtes renvoyé à la page d'accueil et les jetons mis à jour sont affichés.
Effectuer un rafraîchissement de nouvelle session
Copiez la valeur du refresh_token affiché sur la page d'accueil dans votre presse-papiers.
Arrêtez et redémarrez l'application exemple pour effacer toutes les données de session.
Dans le navigateur, initiez le rafraîchissement de nouvelle session en naviguant vers 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 recollecte pour collecter les données de navigateur mises à jour. L'ID de session est capturé de 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 navigateur, le risque adaptatif sera faible et votre session sera é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 utilisé avec cette application auparavant) et naviguez vers l'URL suivante (en remplaçant encore une fois 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 navigateur, le risque adaptatif sera élevé et vous serez requis de compléter un défi OTP e-mail avant que votre session soit établie.
Updated 23 days ago