Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
- Zkontrolujte, zda token již existuje v mezipaměti tokenů pro dané
scopes,client id,authoritya/nebohomeAccountIdentifier. - Pokud pro dané parametry existuje token, ujistěte se, že získáme jednu shodu a zkontrolujeme vypršení platnosti.
- Pokud platnost přístupového tokenu nevypršela, služba MSAL vrátí odpověď s příslušnými tokeny.
- 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ěď.
- 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í objektuPublicClientApplication. 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
acquireTokenSilentpři načtení stránky s parametrem požadavkuforceRefreshnastaveným natrue. 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
forceRefreshnenastavené nebo jej explicitně nastavte nafalse, 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
acquireTokenSilents parametrem požadavkuforceRefreshnastaveným natruea s parametremrefreshTokenExpirationOffsetSecondsnastaveným na požadovanou dobu bez interakce (v sekundách) - Při následných voláních ponechte
forceRefresharefreshTokenExpirationOffsetSecondsnenastavené, 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-acquireTokenSilentse 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,acquireTokenSilentpokusí se bezobslužně získat nový přístupový token, token ID a obnovovací token. -
CacheLookupPolicy.AccessToken-acquireTokenSilentbude hledat pouze přístupové tokeny v mezipaměti. Nepokusí se obnovit přístup ani aktualizovat tokeny. -
CacheLookupPolicy.AccessTokenAndRefreshToken-acquireTokenSilentse 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 aacquireTokenSilentselže. -
CacheLookupPolicy.RefreshToken-acquireTokenSilentnebude 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 aacquireTokenSilentselže. -
CacheLookupPolicy.RefreshTokenAndNetwork-acquireTokenSilentnebude 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-acquireTokenSilentse 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
Popup
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.