Životnosti tokenů, vypršení platnosti a prodloužení platnosti

Než začnete tady, ujistěte se, že rozumíte tomu, jak se přihlásit a získat tokeny.

Při používání MSAL.jsbyste měli pochopit důsledky načítání tokenů pro uživatele a způsob správy životnosti těchto tokenů.

Životnosti a vypršení platnosti tokenů

Můžete nakonfigurovat životnost tokenů přístupových, ID nebo SAML (Security Assertion Markup Language) vydávaných platformou Microsoft identity platform. Některé informace jsou shrnuté níže.

Identifikační tokeny

Tokeny ID jsou vázané na konkrétní kombinaci účtu a klienta a obvykle obsahují informace o profilu uživatele. Životnost relace uživatele webové aplikace se obvykle shoduje s životností relace ID tokenu, která je ve výchozím nastavení 24 hodin. Můžete si přečíst další informace o konfiguraci životnosti tokenů.

Přístupové tokeny

Přístupové tokeny v prohlížeči mají výchozí doporučené vypršení platnosti 1 hodinu. Po uplynutí této hodiny budou všechna volání s expirovaným tokenem Bearer odmítnuta. Tento token lze tiše obnovit pomocí obnovovacího tokenu získaného spolu s tímto tokenem. Můžete si přečíst další informace o konfiguraci životnosti tokenů.

Aktualizace tokenů

Obnovovací tokeny poskytnuté aplikacím Single-Page jsou tokeny aktualizace časově omezené (obvykle 24 hodin od doby načítání). Jde o pevné, neposuvné okno s doživotní životností. Při každém použití obnovovacího tokenu k obnovení přístupového tokenu se nový obnovovací token načte s obnoveným přístupovým tokenem. Tento nový obnovovací token bude mít životnost stejnou jako zbývající životnost původního obnovovacího tokenu. Jakmile vyprší platnost obnovovacího tokenu, je nutné znovu zahájit autorizační tok s autorizačním kódem, získat autorizační kód a vyměnit jej za novou sadu tokenů.

Poznámka: Při získání nového obnovovacího tokenu msal.js nahradí obnovovací token uložený v mezipaměti novým obnovovacím tokenem, ale starý obnovovací token není serverem neplatný a může být stále používán k získání přístupových tokenů až do vypršení jeho platnosti.

Obnovení tokenu

Objekt PublicClientApplication zveřejňuje rozhraní API, acquireTokenSilent které je určeno k tichému načtení tokenu, jehož platnost nevypršela. Provede to v několika krocích:

  1. Zkontrolujte, zda token již existuje v mezipaměti tokenů pro dané scopes, client id, authority a/nebo homeAccountIdentifier.
  2. Pokud pro dané parametry existuje token, ujistěte se, že získáme jednu shodu a zkontrolujeme vypršení platnosti.
  3. Pokud platnost přístupového tokenu nevypršela, služba MSAL vrátí odpověď s příslušnými tokeny.
  4. Pokud platnost přístupového tokenu vypršela, ale obnovovací token je stále platný, služba MSAL použije daný obnovovací token k načtení nové sady tokenů a pak vrátí odpověď.
  5. Pokud vypršela platnost obnovovacího tokenu, služba MSAL se pokusí načíst přístupové tokeny bezobslužně pomocí skrytého prvku iframe. Použije identifikátor sid nebo uživatelské jméno v objektu deklarací účtu k získání informace o relaci uživatele. Pokud se toto skryté volání prvku iframe nezdaří, služba MSAL předá chybu ze serveru jako metodu InteractionRequiredAuthError, která požádá o načtení autorizačního kódu pro načtení nové sady tokenů. Můžete to provést voláním rozhraní API login nebo acquireToken pomocí objektu PublicClientApplication. Pokud je relace stále aktivní, server odešle kód bez výzev uživatele. Jinak bude uživatel muset zadat své přihlašovací údaje.

Další informace o parametrech konfigurace, které můžete pro metodu nastavit, najdete v článku acquireTokenSilent.

Vyhnutí se interaktivním přerušením během uživatelovy relace

V některých případech můžete chtít v případě potřeby předem vyvolat interakci na začátku relace uživatele, abyste zajistili, že bude moct dál získávat tokeny bezobslužně a používat vaši aplikaci bez dalších přerušení. Toho můžete samozřejmě dosáhnout vyvoláním interakce pokaždé, když se aplikace poprvé načte, jedná se ale o špatné uživatelské prostředí a méně výkonné, pokud už uživatel má tokeny z předchozí relace nebo jiného okna nebo karty. Místo toho můžete použít acquireTokenSilent několik parametrů požadavku, abyste zajistili, že mezipaměť má k dispozici potřebné tokeny, které se budou bezobslužně vracet po určitou dobu.

Aby bylo zajištěno, že acquireTokenSilent může vracet platné tokeny po dobu nejméně 1 hodiny:

  • Zavolejte acquireTokenSilent při načtení stránky s parametrem požadavku forceRefresh nastaveným na true. Tím se mezipaměť přeskočí a získá nový token, který pak bude možné obsluhovat z mezipaměti při následných voláních.
  • Při následných voláních ponechte forceRefresh nenastavené nebo jej explicitně nastavte na false, aby bylo zajištěno, že tokeny lze poskytovat z mezipaměti.

Aby acquireTokenSilent mohlo vracet platné tokeny po libovolnou dobu až do 24 hodin:

  • Při načtení stránky zavolejte acquireTokenSilent s parametrem požadavku forceRefresh nastaveným na true a s parametrem refreshTokenExpirationOffsetSeconds nastaveným na požadovanou dobu bez interakce (v sekundách)
  • Při následných voláních ponechte forceRefresh a refreshTokenExpirationOffsetSeconds nenastavené, aby tokeny mohly být poskytovány z mezipaměti.

Pokud chcete například zajistit, aby uživatel mohl během následujících 2 hodin získat tokeny bezobslužně:

var request = {
    scopes: ["Mail.Read"],
    account: currentAccount,
    forceRefresh: true,
    refreshTokenExpirationOffsetSeconds: 7200 // 2 hours * 60 minutes * 60 seconds = 7200 seconds
};

const tokenResponse = await msalInstance.acquireTokenSilent(request).catch(async (error) => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        await msalInstance.acquireTokenRedirect(request);
    }
});

Poznámka: Nikdy není zaručeno, že token lze bezobslužně získat, i když ještě nevypršela platnost obnovovacího tokenu. Výše popsané vzory se snaží minimalizovat interakci v nevhodných časech, ale neodstraní možnost požadovaných interakcí v rámci požadovaných časových rámců. Kromě toho ne všichni zprostředkovatelé identity vrací vypršení platnosti obnovovacího tokenu – v takových případech refreshTokenExpirationOffsetSeconds se parametr požadavku nevyhodnotí.

Zásady vyhledávání mezipaměti

Do požadavku je možné volitelně zadat zásady vyhledávání mezipaměti. Zásady vyhledávání mezipaměti jsou:

  • CacheLookupPolicy.Default - acquireTokenSilent se pokusí načíst přístupový token z mezipaměti. Pokud přístupový token vypršel nebo ho nelze najít, použije se obnovovací token k získání nového přístupového tokenu. Nakonec, pokud vypršela platnost obnovovacího tokenu, acquireTokenSilent pokusí se bezobslužně získat nový přístupový token, token ID a obnovovací token.
  • CacheLookupPolicy.AccessToken - acquireTokenSilent bude hledat pouze přístupové tokeny v mezipaměti. Nepokusí se obnovit přístup ani aktualizovat tokeny.
  • CacheLookupPolicy.AccessTokenAndRefreshToken - acquireTokenSilent se pokusí načíst přístupový token z mezipaměti. Pokud platnost přístupového tokenu vypršela nebo jej nelze najít, k získání nového tokenu se použije obnovovací token. Pokud platnost obnovovacího tokenu vypršela, neprodlouží se a acquireTokenSilent selže.
  • CacheLookupPolicy.RefreshToken - acquireTokenSilent nebude se pokoušet načíst přístupové tokeny z mezipaměti a místo toho se pokusí vyměnit obnovovací token mezipaměti pro nový přístupový token. Pokud platnost obnovovacího tokenu vypršela, neprodlouží se a acquireTokenSilent selže.
  • CacheLookupPolicy.RefreshTokenAndNetwork - acquireTokenSilent nebude v mezipaměti hledat přístupový token. Přejde přímo do sítě pomocí obnovovacího tokenu uloženého v mezipaměti. Pokud vypršela platnost obnovovacího tokenu, provede se pokus o jeho obnovení. To je ekvivalentní nastavení forceRefresh: true.
  • CacheLookupPolicy.Skip - acquireTokenSilent se pokusí obnovit přístupové i obnovovací tokeny. Nebude vypadat v mezipaměti. To se vždy nezdaří, pokud prohlížeč zablokuje soubory cookie třetích stran.

Fragmenty kódu

var username = "test@contoso.com";
var currentAccount = msalInstance.getAccount({ username });
var silentRequest = {
    scopes: ["Mail.Read"],
    account: currentAccount,
    forceRefresh: false,
    cacheLookupPolicy: CacheLookupPolicy.Default // will default to CacheLookupPolicy.Default if omitted
};

var request = {
    scopes: ["Mail.Read"],
    loginHint: currentAccount.username // For v1 endpoints, use upn from idToken claims
};

const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest).catch(async (error) => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return await msalInstance.acquireTokenPopup(request).catch(error => {
            if (error instanceof InteractionRequiredAuthError) {
                // fallback to interaction when silent call fails
                return msalInstance.acquireTokenRedirect(request)
            }
        });
    }
});

Přesměrování

var username = "test@contoso.com";
var currentAccount = msalInstance.getAccount({ username });
var silentRequest = {
    scopes: ["Mail.Read"],
    account: currentAccount,
    forceRefresh: false,
    cacheLookupPolicy: CacheLookupPolicy.Default // will default to CacheLookupPolicy.Default if omitted
};

var request = {
    scopes: ["Mail.Read"],
    loginHint: currentAccount.username // For v1 endpoints, use upn from idToken claims
};

const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest).catch(error => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return msalInstance.acquireTokenRedirect(request)
    }
});

Další kroky

Zjistěte, jak se odhlásit.