{"id":1308,"date":"2026-11-09T15:00:00","date_gmt":"2026-11-09T14:00:00","guid":{"rendered":"https:\/\/remivernier.com\/?p=1308"},"modified":"2026-11-09T15:00:00","modified_gmt":"2026-11-09T14:00:00","slug":"entra-id-refresh-token-rejeu-revocation","status":"publish","type":"post","link":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/","title":{"rendered":"Entra ID: refresh token, rejeu et r\u00e9vocation"},"content":{"rendered":"<p>Dans la vie d&rsquo;un tenant Entra ID, ce moment arrive t\u00f4t ou tard: un collaborateur signale le vol de son portable, le support r\u00e9initialise son mot de passe, et pourtant une application continue d&rsquo;acc\u00e9der \u00e0 sa messagerie pendant encore quelques minutes. L&rsquo;\u00e9quipe s\u00e9curit\u00e9 veut alors savoir ce qui a surv\u00e9cu au changement de mot de passe, et pour combien de temps.<\/p>\n<p>La r\u00e9ponse tient presque toujours dans deux jetons. Le jeton d&rsquo;acc\u00e8s vit peu de temps. Le refresh token vit longtemps et permet \u00e0 l&rsquo;application d&rsquo;obtenir de nouveaux jetons d&rsquo;acc\u00e8s sans rien redemander \u00e0 l&rsquo;utilisateur. Nous allons suivre un refresh token de son \u00e9mission \u00e0 sa r\u00e9vocation, en appelant directement le point de terminaison \/token et Microsoft Graph, et en lisant les codes AADSTS qu&rsquo;Entra ID renvoie \u00e0 chaque refus.<\/p>\n<h2>Pr\u00e9sentation de la maquette<\/h2>\n<p>Tenant: testlocal.onmicrosoft.com<\/p>\n<p>Utilisateur: user01@testlocal.onmicrosoft.com<\/p>\n<p>Application: app-monsite, enregistr\u00e9e comme client public (redirection http:\/\/localhost), avec la permission d\u00e9l\u00e9gu\u00e9e User.Read sur Graph<\/p>\n<p>Outils: curl et jq sur un poste d&rsquo;administration, ainsi que le module Microsoft Graph PowerShell pour la r\u00e9vocation.<\/p>\n<p>Attention: les dur\u00e9es cit\u00e9es plus bas sont celles de la <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity-platform\/refresh-tokens\">documentation Microsoft sur les refresh tokens<\/a>. Ce sont des valeurs par d\u00e9faut, qu&rsquo;une strat\u00e9gie d&rsquo;acc\u00e8s conditionnel peut raccourcir. Sur un tenant de production, il faut donc v\u00e9rifier ce qui s&rsquo;applique r\u00e9ellement avant de b\u00e2tir une proc\u00e9dure dessus.<\/p>\n<h2>Un jeton que nous ne pouvons pas lire<\/h2>\n<p>Le jeton d&rsquo;acc\u00e8s est un JWT que nous pouvons d\u00e9coder en base64, comme nous l&rsquo;avions fait pour l&rsquo;ent\u00eate Authorization dans l&rsquo;article sur les <a href=\"https:\/\/remivernier.com\/index.php\/2018\/09\/16\/exploration-des-entetes-http-www-authenticate\/\">ent\u00eates HTTP WWW-Authenticate et Authorization<\/a>. Le refresh token Entra ID, lui, est chiffr\u00e9 et seule la plateforme d&rsquo;identit\u00e9 Microsoft peut le lire. Il n&rsquo;y a donc pas de claim <code>exp<\/code> \u00e0 inspecter ni de date d&rsquo;expiration \u00e0 extraire. Ce que nous pouvons lire, c&rsquo;est la r\u00e9ponse du point de terminaison \/token, et surtout le message d&rsquo;erreur qu&rsquo;il renvoie quand il refuse le jeton.<\/p>\n<p>Le premier refresh token (appelons-le RT1) est \u00e9mis lors de l&rsquo;\u00e9change du code d&rsquo;autorisation, \u00e0 condition que le scope <code>offline_access<\/code> ait \u00e9t\u00e9 demand\u00e9. Nous le pr\u00e9sentons ensuite au point de terminaison avec le grant <code>refresh_token<\/code>:<\/p>\n<pre class=\"wp-block-code\"><code>curl -s https:\/\/login.microsoftonline.com\/testlocal.onmicrosoft.com\/oauth2\/v2.0\/token \\\n  -d client_id=$CLIENT_ID \\\n  -d grant_type=refresh_token \\\n  --data-urlencode refresh_token=$RT1 \\\n  --data-urlencode \"scope=https:\/\/graph.microsoft.com\/User.Read offline_access\" \\\n  | jq 'del(.access_token, .refresh_token)'<\/code><\/pre>\n<p>Nous retirons volontairement les deux jetons de l&rsquo;affichage. La r\u00e9ponse prend cette forme:<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"token_type\": \"Bearer\",\n  \"scope\": \"https:\/\/graph.microsoft.com\/User.Read\",\n  \"expires_in\": 4732,\n  \"ext_expires_in\": 4732\n}<\/code><\/pre>\n<p>-> <code>expires_in<\/code> concerne le jeton d&rsquo;acc\u00e8s seulement, et rien dans la r\u00e9ponse ne donne la dur\u00e9e de vie du nouveau refresh token.<\/p>\n<p>Le champ <code>refresh_token<\/code> contient un nouveau jeton, RT2. Un refresh token est remplac\u00e9 par un nouveau \u00e0 chaque utilisation. Par d\u00e9faut, il vit 90 jours dans tous les sc\u00e9narios, sauf quand il est envoy\u00e9 \u00e0 une URI de redirection de type SPA: dans ce cas il expire au bout de 24 heures, et les jetons obtenus ensuite \u00e0 partir de lui h\u00e9ritent de cette \u00e9ch\u00e9ance.<\/p>\n<p>C&rsquo;est toute la diff\u00e9rence entre les deux mod\u00e8les. Pour une application web, mobile ou de bureau, la fen\u00eatre glisse: chaque utilisation produit un jeton neuf, et un client utilis\u00e9 r\u00e9guli\u00e8rement peut se passer de toute nouvelle saisie pendant des mois. Pour une SPA, l&rsquo;\u00e9ch\u00e9ance est absolue et l&rsquo;application doit refaire un flux interactif toutes les 24 heures, quelle que soit son activit\u00e9. Une strat\u00e9gie d&rsquo;acc\u00e8s conditionnel avec une fr\u00e9quence de connexion ajoute une limite absolue par-dessus ces deux mod\u00e8les. Les strat\u00e9gies de dur\u00e9e de vie configurables ne s&rsquo;appliquent plus aux refresh tokens depuis 2021: c&rsquo;est l&rsquo;acc\u00e8s conditionnel qui a pris le relais.<\/p>\n<p>Chaque fin de vie a son code d&rsquo;erreur, toujours renvoy\u00e9 avec <code>\"error\": \"invalid_grant\"<\/code>:<\/p>\n<table>\n<thead>\n<tr>\n<th>Situation<\/th>\n<th>Nature de la limite<\/th>\n<th>Code renvoy\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Jeton inutilis\u00e9 trop longtemps (client non SPA)<\/td>\n<td>Glissante<\/td>\n<td>AADSTS700082<\/td>\n<\/tr>\n<tr>\n<td>Jeton \u00e9mis pour une SPA, 24 heures \u00e9coul\u00e9es<\/td>\n<td>Absolue<\/td>\n<td>AADSTS700084<\/td>\n<\/tr>\n<tr>\n<td>Fr\u00e9quence de connexion de l&rsquo;acc\u00e8s conditionnel atteinte<\/td>\n<td>Absolue<\/td>\n<td>AADSTS70043<\/td>\n<\/tr>\n<tr>\n<td>Sessions r\u00e9voqu\u00e9es ou mot de passe chang\u00e9<\/td>\n<td>\u00c9v\u00e9nement<\/td>\n<td>AADSTS50173<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Rejeu et r\u00e9vocation<\/h2>\n<p>Si nous rejouons RT1 alors que RT2 a d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9mis, la plateforme d&rsquo;identit\u00e9 Microsoft ne r\u00e9voque pas les anciens refresh tokens quand ils servent \u00e0 obtenir de nouveaux jetons d&rsquo;acc\u00e8s. La documentation demande \u00e0 l&rsquo;application de supprimer elle-m\u00eame l&rsquo;ancien jeton. RT1 et RT2 restent donc utilisables tous les deux, et rejouer RT1 nous donne un RT3 parfaitement valide. Le remplacement \u00e0 chaque utilisation existe bien, mais aucune d\u00e9tection de r\u00e9utilisation ne vient avec. Ce point est tr\u00e8s important pour la suite: la RFC 9700 (OAuth 2.0 Security Best Current Practice) demande que les refresh tokens des clients publics soient soit li\u00e9s \u00e0 leur d\u00e9tenteur, soit soumis \u00e0 une rotation qui permet de rep\u00e9rer un jeton d\u00e9j\u00e0 utilis\u00e9.<\/p>\n<p>Ce qui arr\u00eate toute la cha\u00eene, c&rsquo;est la r\u00e9vocation c\u00f4t\u00e9 annuaire. L&rsquo;appel Graph <a href=\"https:\/\/github.com\/microsoftgraph\/microsoft-graph-docs-contrib\/blob\/main\/api-reference\/beta\/api\/user-revokesigninsessions.md\">revokeSignInSessions<\/a> invalide tous les refresh tokens \u00e9mis pour l&rsquo;utilisateur, ainsi que les cookies de session de son navigateur. Pour cela, il fixe la propri\u00e9t\u00e9 <code>signInSessionsValidFromDateTime<\/code> \u00e0 l&rsquo;heure courante. En PowerShell, l&rsquo;\u00e9quivalent est <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.graph.users.actions\/revoke-mgusersigninsession?view=graph-powershell-1.0\">Revoke-MgUserSignInSession<\/a>, avec au minimum la permission User.RevokeSessions.All:<\/p>\n<pre class=\"wp-block-code\"><code>Connect-MgGraph -Scopes \"User.RevokeSessions.All\",\"User.Read.All\"\nRevoke-MgUserSignInSession -UserId user01@testlocal.onmicrosoft.com\n\nGet-MgUser -UserId user01@testlocal.onmicrosoft.com `\n  -Property signInSessionsValidFromDateTime |\n  Select-Object SignInSessionsValidFromDateTime<\/code><\/pre>\n<p>La documentation pr\u00e9vient qu&rsquo;il peut s&rsquo;\u00e9couler quelques minutes avant que les jetons soient r\u00e9ellement r\u00e9voqu\u00e9s. Une fois ce d\u00e9lai pass\u00e9, le rejeu de RT1, RT2 ou RT3 donne la m\u00eame r\u00e9ponse:<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"error\": \"invalid_grant\",\n  \"error_description\": \"AADSTS50173: The provided grant has expired due to it being revoked, a fresh auth token is needed. The user might have changed or reset their password. The grant was issued on '2026-11-09T08:12:41.0000000Z' and the TokensValidFrom date (before which tokens are not valid) for this user is '2026-11-09T09:30:05.0000000Z'.\",\n  \"error_codes\": [50173]\n}<\/code><\/pre>\n<p>Le message contient les deux dates qui comptent: la date d&rsquo;\u00e9mission du grant d&rsquo;origine et la nouvelle borne <code>TokensValidFrom<\/code>. Tout jeton dont la cha\u00eene remonte \u00e0 une authentification ant\u00e9rieure \u00e0 cette borne est refus\u00e9, ce qui explique pourquoi la date du premier \u00e9change reste attach\u00e9e aux jetons qui en descendent.<\/p>\n<figure class=\"wp-block-image\">\n<svg viewBox=\"0 0 720 330\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" font-family=\"sans-serif\" font-size=\"13\">\n<defs><marker id=\"fl\" markerWidth=\"10\" markerHeight=\"8\" refX=\"9\" refY=\"4\" orient=\"auto\"><path d=\"M0,0 L10,4 L0,8 z\" fill=\"#333\"\/><\/marker><\/defs>\n<rect x=\"20\" y=\"20\" width=\"160\" height=\"290\" fill=\"#e8f0fe\" stroke=\"#333\"\/>\n<text x=\"100\" y=\"45\" text-anchor=\"middle\" font-size=\"14\">Client app-monsite<\/text>\n<rect x=\"540\" y=\"20\" width=\"160\" height=\"290\" fill=\"#fdf3e1\" stroke=\"#333\"\/>\n<text x=\"620\" y=\"45\" text-anchor=\"middle\" font-size=\"14\">Entra ID \/token<\/text>\n<line x1=\"180\" y1=\"75\" x2=\"540\" y2=\"75\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"360\" y=\"68\" text-anchor=\"middle\">grant_type=refresh_token (RT1)<\/text>\n<line x1=\"540\" y1=\"105\" x2=\"180\" y2=\"105\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"360\" y=\"98\" text-anchor=\"middle\">jeton d&rsquo;acc\u00e8s + RT2 (RT1 reste valide)<\/text>\n<line x1=\"180\" y1=\"145\" x2=\"540\" y2=\"145\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"360\" y=\"138\" text-anchor=\"middle\">rejeu de RT1<\/text>\n<line x1=\"540\" y1=\"175\" x2=\"180\" y2=\"175\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"360\" y=\"168\" text-anchor=\"middle\">jeton d&rsquo;acc\u00e8s + RT3<\/text>\n<rect x=\"230\" y=\"195\" width=\"260\" height=\"40\" fill=\"#e6f4ea\" stroke=\"#333\"\/>\n<text x=\"360\" y=\"213\" text-anchor=\"middle\">revokeSignInSessions<\/text>\n<text x=\"360\" y=\"229\" text-anchor=\"middle\">signInSessionsValidFromDateTime = maintenant<\/text>\n<line x1=\"180\" y1=\"265\" x2=\"540\" y2=\"265\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"360\" y=\"258\" text-anchor=\"middle\">RT1, RT2 ou RT3<\/text>\n<line x1=\"540\" y1=\"295\" x2=\"180\" y2=\"295\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"360\" y=\"288\" text-anchor=\"middle\">invalid_grant AADSTS50173<\/text>\n<\/svg><figcaption>Remplacement sans invalidation, puis r\u00e9vocation par la borne signInSessionsValidFromDateTime<\/figcaption><\/figure>\n<p>Attention, la r\u00e9vocation ne touche pas les jetons d&rsquo;acc\u00e8s d\u00e9j\u00e0 \u00e9mis. Un jeton d&rsquo;acc\u00e8s reste accept\u00e9 par la ressource jusqu&rsquo;\u00e0 son expiration (une heure ou un peu plus par d\u00e9faut, d&rsquo;o\u00f9 les 4732 secondes vues plus haut), sauf si la ressource prend en charge l&rsquo;\u00e9valuation continue de l&rsquo;acc\u00e8s (CAE). Exchange Online, SharePoint Online et Teams re\u00e7oivent alors l&rsquo;\u00e9v\u00e9nement de r\u00e9vocation et rejettent le jeton presque imm\u00e9diatement. Les minutes de d\u00e9lai observ\u00e9es par le support dans notre histoire d&rsquo;introduction viennent de l\u00e0.<\/p>\n<p>Autre pi\u00e8ge en environnement multi-tenant: les refresh tokens d&rsquo;un invit\u00e9 B2B ne sont pas r\u00e9voqu\u00e9s dans le tenant de ressource. La r\u00e9vocation doit se faire dans son tenant d&rsquo;origine.<\/p>\n<h2>Ce qu&rsquo;un attaquant en fait<\/h2>\n<p>Le sc\u00e9nario de compromission se r\u00e9sume en quelques \u00e9tapes. L&rsquo;attaquant r\u00e9cup\u00e8re un refresh token, soit par un proxy de phishing de type adversary-in-the-middle qui relaie toute la connexion, MFA compris, soit par un infostealer qui vide le cache d&rsquo;une application ou d&rsquo;un navigateur sur le poste. Il le pr\u00e9sente ensuite depuis sa propre infrastructure. MITRE ATT&amp;CK range ces deux temps sous T1528 (Steal Application Access Token) pour le vol et T1550.001 (Use Alternate Authentication Material: Application Access Token) pour l&rsquo;usage. L&rsquo;authentification forte a d\u00e9j\u00e0 eu lieu lors de la connexion d&rsquo;origine, et le jeton en garde le b\u00e9n\u00e9fice. Sur un client non SPA, la fen\u00eatre glissante permet \u00e0 l&rsquo;attaquant de prolonger l&rsquo;acc\u00e8s aussi longtemps qu&rsquo;il utilise le jeton, et ce que fait la victime ne l&rsquo;en emp\u00eache pas, puisque ses propres renouvellements n&rsquo;invalident rien.<\/p>\n<p>Le rayon d&rsquo;impact d\u00e9passe la ressource d&rsquo;origine. Un refresh token est li\u00e9 \u00e0 un couple utilisateur et client, mais pas \u00e0 une ressource ni \u00e0 un tenant. Avec un jeton obtenu pour Graph, nous pouvons donc demander des jetons d&rsquo;acc\u00e8s pour toute autre ressource que ce client a le droit d&rsquo;atteindre pour cet utilisateur. Plus l&rsquo;application cliente a de permissions consenties, plus le jeton vol\u00e9 ouvre de portes. Les jetons de premi\u00e8re partie Microsoft, \u00e9mis pour des clients tr\u00e8s largement autoris\u00e9s, sont les plus int\u00e9ressants pour un attaquant. Le refresh token du navigateur et des applications natives sur un poste joint s&rsquo;appuie de son c\u00f4t\u00e9 sur le PRT, dont nous avions d\u00e9taill\u00e9 la m\u00e9canique dans l&rsquo;<a href=\"https:\/\/remivernier.com\/index.php\/2026\/10\/28\/anatomie-primary-refresh-token-entra-id\/\">anatomie du Primary Refresh Token<\/a>.<\/p>\n<p>La d\u00e9tection est difficile, car un rejeu ressemble \u00e0 un renouvellement silencieux l\u00e9gitime. Il n&rsquo;appara\u00eet pas dans les connexions interactives, aucune demande MFA n&rsquo;est d\u00e9clench\u00e9e, et il se retrouve noy\u00e9 dans le volume \u00e9norme des journaux de connexions non interactives. Le signal le plus exploitable est l&rsquo;incoh\u00e9rence r\u00e9seau au sein d&rsquo;une m\u00eame session: un m\u00eame <code>SessionId<\/code> utilis\u00e9 depuis des adresses ou des pays diff\u00e9rents dans un court intervalle. Dans Log Analytics, une premi\u00e8re requ\u00eate de chasse peut ressembler \u00e0 ceci:<\/p>\n<pre class=\"wp-block-code\"><code>AADNonInteractiveUserSignInLogs\n| where TimeGenerated &gt; ago(1d)\n| where IncomingTokenType == \"refreshToken\"\n| summarize IPs = make_set(IPAddress), Lieux = make_set(Location),\n            Debut = min(TimeGenerated), Fin = max(TimeGenerated)\n          by UserPrincipalName, SessionId, AppDisplayName\n| where array_length(IPs) &gt; 1 and array_length(Lieux) &gt; 1<\/code><\/pre>\n<p>Les r\u00e9sultats restent \u00e0 qualifier: un utilisateur nomade ou une sortie internet qui change d&rsquo;adresse produit le m\u00eame motif. C&rsquo;est en corr\u00e9lant avec l&rsquo;ASN, la conformit\u00e9 de l&rsquo;appareil (<code>DeviceDetail<\/code>) et les d\u00e9tections d&rsquo;Entra ID Protection, comme le jeton anormal, que nous \u00e9cartons les faux positifs.<\/p>\n<p>C\u00f4t\u00e9 durcissement, la proc\u00e9dure de r\u00e9ponse doit suivre le bon ordre: d\u00e9sactiver le compte, r\u00e9voquer les sessions, r\u00e9initialiser le mot de passe, puis v\u00e9rifier dans les journaux non interactifs qu&rsquo;aucun renouvellement r\u00e9ussi n&rsquo;appara\u00eet apr\u00e8s la borne <code>signInSessionsValidFromDateTime<\/code>. Si nous r\u00e9voquons sans d\u00e9sactiver le compte alors que l&rsquo;attaquant contr\u00f4le encore le point d&rsquo;entr\u00e9e (le proxy de phishing ou le poste infect\u00e9), il r\u00e9cup\u00e8re simplement un nouveau jeton \u00e0 la connexion suivante de la victime.<\/p>\n<p>En pr\u00e9vention, je recommande de commencer par la protection des jetons (Token Protection) de l&rsquo;acc\u00e8s conditionnel. Elle lie le jeton de session \u00e0 l&rsquo;appareil qui l&rsquo;a obtenu, ce qui rend le rejeu depuis une autre machine inop\u00e9rant. Sa couverture reste limit\u00e9e \u00e0 certaines plateformes et applications, et il faut donc v\u00e9rifier dans la documentation lesquelles sont prises en charge au moment du d\u00e9ploiement. Sur les applications sensibles, une fr\u00e9quence de connexion courte transforme la fen\u00eatre glissante en limite absolue. Pour les applications d\u00e9velopp\u00e9es en interne, la documentation demande aussi de supprimer l&rsquo;ancien refresh token d\u00e8s qu&rsquo;un nouveau est obtenu: Entra ID ne le fait pas, et c&rsquo;est donc le stockage c\u00f4t\u00e9 client qui d\u00e9termine combien de jetons valides tra\u00eenent sur un poste.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comment Entra ID \u00e9met, renouvelle et r\u00e9voque un refresh token: dur\u00e9e glissante ou absolue, rejeu d&rsquo;un ancien jeton, codes AADSTS et d\u00e9tection.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20,3,37],"tags":[140,141,80,142,138,137,139],"class_list":["post-1308","post","type-post","status-publish","format-standard","hentry","category-azure-ad","category-protocoles","category-securite","tag-aadsts","tag-acces-conditionnel","tag-entra-id","tag-microsoft-graph","tag-oauth-2-0","tag-refresh-token","tag-revokesigninsessions"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Entra ID: refresh token, rejeu et r\u00e9vocation - R\u00e9mi VERNIER<\/title>\n<meta name=\"description\" content=\"Comment Entra ID \u00e9met, renouvelle et r\u00e9voque un refresh token: dur\u00e9e glissante ou absolue, rejeu d&#039;un ancien jeton, codes AADSTS et d\u00e9tection.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Entra ID: refresh token, rejeu et r\u00e9vocation - R\u00e9mi VERNIER\" \/>\n<meta property=\"og:description\" content=\"Comment Entra ID \u00e9met, renouvelle et r\u00e9voque un refresh token: dur\u00e9e glissante ou absolue, rejeu d&#039;un ancien jeton, codes AADSTS et d\u00e9tection.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/\" \/>\n<meta property=\"og:site_name\" content=\"R\u00e9mi VERNIER\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-09T14:00:00+00:00\" \/>\n<meta name=\"author\" content=\"R\u00e9mi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"R\u00e9mi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/\"},\"author\":{\"name\":\"R\u00e9mi\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"headline\":\"Entra ID: refresh token, rejeu et r\u00e9vocation\",\"datePublished\":\"2026-11-09T14:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/\"},\"wordCount\":1828,\"commentCount\":0,\"keywords\":[\"aadsts\",\"acces conditionnel\",\"entra id\",\"microsoft graph\",\"oauth 2.0\",\"refresh token\",\"revokesigninsessions\"],\"articleSection\":[\"Azure AD\",\"Protocoles\",\"S\u00e9curit\u00e9\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/\",\"url\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/\",\"name\":\"Entra ID: refresh token, rejeu et r\u00e9vocation - R\u00e9mi VERNIER\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\"},\"datePublished\":\"2026-11-09T14:00:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"description\":\"Comment Entra ID \u00e9met, renouvelle et r\u00e9voque un refresh token: dur\u00e9e glissante ou absolue, rejeu d'un ancien jeton, codes AADSTS et d\u00e9tection.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/09\\\/entra-id-refresh-token-rejeu-revocation\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/remivernier.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Entra ID: refresh token, rejeu et r\u00e9vocation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\",\"url\":\"https:\\\/\\\/remivernier.com\\\/\",\"name\":\"R\u00e9mi VERNIER\",\"description\":\"Identit\u00e9, s\u00e9curit\u00e9, SAP et IA : Active Directory, Azure &amp; co...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/remivernier.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\",\"name\":\"R\u00e9mi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"caption\":\"R\u00e9mi\"},\"sameAs\":[\"http:\\\/\\\/www.linkedin.com\\\/in\\\/remi-vernier\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Entra ID: refresh token, rejeu et r\u00e9vocation - R\u00e9mi VERNIER","description":"Comment Entra ID \u00e9met, renouvelle et r\u00e9voque un refresh token: dur\u00e9e glissante ou absolue, rejeu d'un ancien jeton, codes AADSTS et d\u00e9tection.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/","og_locale":"fr_FR","og_type":"article","og_title":"Entra ID: refresh token, rejeu et r\u00e9vocation - R\u00e9mi VERNIER","og_description":"Comment Entra ID \u00e9met, renouvelle et r\u00e9voque un refresh token: dur\u00e9e glissante ou absolue, rejeu d'un ancien jeton, codes AADSTS et d\u00e9tection.","og_url":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/","og_site_name":"R\u00e9mi VERNIER","article_published_time":"2026-11-09T14:00:00+00:00","author":"R\u00e9mi","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"R\u00e9mi","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/#article","isPartOf":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/"},"author":{"name":"R\u00e9mi","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"headline":"Entra ID: refresh token, rejeu et r\u00e9vocation","datePublished":"2026-11-09T14:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/"},"wordCount":1828,"commentCount":0,"keywords":["aadsts","acces conditionnel","entra id","microsoft graph","oauth 2.0","refresh token","revokesigninsessions"],"articleSection":["Azure AD","Protocoles","S\u00e9curit\u00e9"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/","url":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/","name":"Entra ID: refresh token, rejeu et r\u00e9vocation - R\u00e9mi VERNIER","isPartOf":{"@id":"https:\/\/remivernier.com\/#website"},"datePublished":"2026-11-09T14:00:00+00:00","author":{"@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"description":"Comment Entra ID \u00e9met, renouvelle et r\u00e9voque un refresh token: dur\u00e9e glissante ou absolue, rejeu d'un ancien jeton, codes AADSTS et d\u00e9tection.","breadcrumb":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/remivernier.com\/"},{"@type":"ListItem","position":2,"name":"Entra ID: refresh token, rejeu et r\u00e9vocation"}]},{"@type":"WebSite","@id":"https:\/\/remivernier.com\/#website","url":"https:\/\/remivernier.com\/","name":"R\u00e9mi VERNIER","description":"Identit\u00e9, s\u00e9curit\u00e9, SAP et IA : Active Directory, Azure &amp; co...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/remivernier.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906","name":"R\u00e9mi","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","caption":"R\u00e9mi"},"sameAs":["http:\/\/www.linkedin.com\/in\/remi-vernier"]}]}},"_links":{"self":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/comments?post=1308"}],"version-history":[{"count":1,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1308\/revisions"}],"predecessor-version":[{"id":1310,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1308\/revisions\/1310"}],"wp:attachment":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/media?parent=1308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/categories?post=1308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/tags?post=1308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}