A token élettartama, lejárata és megújítása

Mielőtt itt elkezdené, győződjön meg arról, hogy tisztában van azzal, hogyan kell bejelentkezni és tokeneket beszerezni.

Az MSAL.js használata során tisztában kell lennie a felhasználók számára történő tokenlekérés következményeivel, valamint e tokenek élettartamának kezelésével.

Tokenek élettartama és lejárata

Konfigurálhatja az Microsoft Identitásplatform által kibocsátott hozzáférési, azonosító- vagy biztonsági helyességi korrektúranyelvi (SAML) jogkivonatok élettartamát. Az alábbiakban összefoglalunk néhány információt.

Azonosító tokenek

Az azonosító jogkivonatok a fiók és az ügyfél meghatározott kombinációjához vannak kötve, és általában a felhasználó profiladatait tartalmazzák. A webalkalmazás felhasználói munkamenetének élettartama általában megegyezik az azonosító jogkivonat munkamenetének élettartamával, amely alapértelmezés szerint 24 óra. A jogkivonatok élettartamának konfigurálásáról bővebben is olvashat.

Hozzáférési jogkivonatok

A böngésző hozzáférési jogkivonatai alapértelmezetten 1 óra lejárati idővel rendelkeznek. Az 1 óra letelte után a lejárt tokennel végzett bearer hívásokat a rendszer elutasítja. Ez a token felhasználói beavatkozás nélkül frissíthető az ezzel a tokennel lekért frissítési tokennel. A jogkivonatok élettartamának konfigurálásáról bővebben is olvashat.

Tokenek frissítése

A Single-Page alkalmazásoknak adott frissítési jogkivonatok korlátozott idejű frissítési jogkivonatok (általában a lekérés időpontjától kezdve 24 óra). Ez egy nem állítható, nem csúsztatott ablak, élettartam. Valahányszor egy frissítési tokent használnak egy hozzáférési token megújítására, a megújított hozzáférési tokennel együtt egy új frissítési tokent is lekérnek. Az új frissítési jogkivonat élettartama megegyezik az eredeti frissítési jogkivonat fennmaradó élettartamával. Ha egy frissítési jogkivonat lejárt, egy új engedélyezési kódfolyamatot kell kezdeményezni egy engedélyezési kód lekéréséhez és egy új jogkivonatkészlet kereskedelméhez.

Megjegyzés: Amikor új frissítési jogkivonatot szerez be, msal.js lecseréli a gyorsítótárazott frissítési jogkivonatot az új frissítési jogkivonatra, a régi frissítési jogkivonatot azonban a kiszolgáló nem érvényteleníti, és a hozzáférési jogkivonatok beszerzésére használható a lejáratáig.

Token megújítása

Az PublicClientApplication objektum egy úgynevezett acquireTokenSilent API-t tesz elérhetővé, amelynek célja a nem lejárt jogkivonat csendes lekérése. Ezt néhány lépésben hajtja végre:

  1. Ellenőrizze, hogy létezik-e már token a tokengyorsítótárban az adott scopes, client id, authority és/vagy homeAccountIdentifier számára.
  2. Ha létezik token a megadott paraméterekhez, akkor győződjünk meg róla, hogy pontosan egy egyezés van, és ellenőrizzük a lejáratát.
  3. Ha a hozzáférési jogkivonat nem járt le, az MSAL választ ad vissza a megfelelő jogkivonatokkal.
  4. Ha a hozzáférési jogkivonat lejárt, de a frissítési jogkivonat továbbra is érvényes, az MSAL a megadott frissítési jogkivonatot használja egy új jogkivonat-készlet lekéréséhez, majd választ ad vissza.
  5. Ha a frissítési jogkivonat lejárt, az MSAL megpróbálja csendesen lekérni a hozzáférési jogkivonatokat egy rejtett iframe használatával. Ez a fiók jogcímeket tartalmazó objektumában található sid vagy felhasználónév alapján kér le egy támpontot a felhasználó munkamenetéről. Ha ez a rejtett iframe-hívás meghiúsul, az MSAL továbbít egy, a kiszolgálótól származó hibát InteractionRequiredAuthError formájában, amely arra kéri, hogy kérjen le egy engedélyezési kódot egy új tokenkészlet lekéréséhez. Ezt úgy teheti meg, hogy bejelentkezési vagy acquireToken API-hívást indít az PublicClientApplication objektummal. Ha a munkamenet továbbra is aktív, a kiszolgáló felhasználói kérések nélkül küld egy kódot. Ellenkező esetben a felhasználónak meg kell adnia a hitelesítő adatait.

A kérelem- és válaszobjektumokról szóló cikkben további információt talál arról, hogy milyen konfigurációs paramétereket állíthat be a acquireTokenSilent metódushoz.

Interaktív megszakítások elkerülése a felhasználói munkamenet közepén

Bizonyos esetekben szükség lehet arra, hogy a felhasználói munkamenet elején előzetesen kezdeményezze a felhasználói interakciót, hogy a felhasználók ezt követően további megszakítások nélkül használhassák az alkalmazást, és felhasználói beavatkozás nélkül szerezhessenek tokeneket. Ezt természetesen úgy érheti el, hogy interakciót invokál minden alkalommal, amikor az alkalmazás első alkalommal töltődik be, ez azonban gyenge felhasználói élmény, és kevésbé teljesíthető, ha egy felhasználó már rendelkezik jogkivonatokkal egy előző munkamenetből vagy egy másik ablakból/lapról. Ehelyett néhány kérelemparaméter használatával biztosíthatja acquireTokenSilent , hogy a gyorsítótár rendelkezik a szükséges jogkivonatokkal, hogy bizonyos ideig csendben térjenek vissza.

Annak biztosítása érdekében, hogy acquireTokenSilent legalább 1 órán keresztül érvényes tokeneket tudjon visszaadni:

  • Hívja meg a(z) acquireTokenSilent elemet az oldal betöltésekor úgy, hogy a(z) forceRefresh kérési paraméter értéke true legyen. Ez kihagyja a gyorsítótárat, és lekér egy új tokent, amelyet a későbbi hívások során a rendszer a gyorsítótárból adhat vissza.
  • A további hívásoknál hagyja a(z) forceRefresh értékét beállítatlanul, vagy állítsa kifejezetten erre: false, hogy a tokenek a gyorsítótárból legyenek kiszolgálva

Annak biztosítása érdekében, hogy acquireTokenSilent legalább tetszőleges, legfeljebb 24 órás időtartamon keresztül érvényes tokeneket tudjon visszaadni:

  • Az oldal betöltésekor hívja meg a(z) acquireTokenSilent elemet úgy, hogy a forceRefresh kérési paraméter értéke true legyen, & a refreshTokenExpirationOffsetSeconds paraméter pedig a kívánt, interakciómentes időtartamra legyen beállítva (másodpercben)
  • A további hívások során hagyja beállítatlanul a(z) forceRefresh és refreshTokenExpirationOffsetSeconds értékét, hogy a tokenek a gyorsítótárból legyenek kiszolgálva

Ha például arról szeretne gondoskodni, hogy a felhasználó a következő 2 órában interakció nélkül szerezhessen be tokeneket:

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);
    }
});

Megjegyzés: Soha nem garantálható, hogy egy jogkivonat akkor is csendesen beszerezhető, ha a frissítési jogkivonat még nem járt le. A fent leírt minták a lehető legjobban igyekeznek minimalizálni az interakciót kényelmetlen időpontokban, de nem szüntetik meg a szükséges interakciók lehetőségét a kívánt időkereteken belül. Emellett nem minden identitásszolgáltató adja vissza a frissítési jogkivonat lejáratát – ezekben az esetekben a refreshTokenExpirationOffsetSeconds kérelemparaméter nem lesz kiértékelve.

Gyorsítótár-lekérdezési szabályzat

A gyorsítótár keresési szabályzata opcionálisan megadható a kéréshez. A gyorsítótár keresési szabályzatai a következők:

  • CacheLookupPolicy.Default - acquireTokenSilent megkísérli lekérni a hozzáférési jogkivonatot a gyorsítótárból. Ha a hozzáférési jogkivonat lejárt, vagy nem található, a rendszer a frissítési jogkivonatot használja egy új jogkivonat beszerzéséhez. Végül, ha a frissítési jogkivonat lejárt, acquireTokenSilent megpróbál csendesen beolvasni egy új hozzáférési jogkivonatot, azonosító jogkivonatot és frissítési jogkivonatot.
  • CacheLookupPolicy.AccessToken - acquireTokenSilent csak hozzáférési jogkivonatokat fog keresni a gyorsítótárban. Nem próbálja meg megújítani a hozzáférési vagy frissítési jogkivonatokat.
  • CacheLookupPolicy.AccessTokenAndRefreshToken - acquireTokenSilent megkísérli lekérni a hozzáférési jogkivonatot a gyorsítótárból. Ha a hozzáférési jogkivonat lejárt vagy nem található, a rendszer a frissítési jogkivonatot használja egy új jogkivonat beszerzéséhez. Ha a frissítési jogkivonat lejárt, az nem lesz megújítva, és acquireTokenSilent sikertelen lesz.
  • CacheLookupPolicy.RefreshToken - acquireTokenSilent nem kísérli meg lekérni a hozzáférési jogkivonatokat a gyorsítótárból, hanem megkísérli kicserélni a gyorsítótárazott frissítési jogkivonatot egy új hozzáférési jogkivonatra. Ha a frissítési jogkivonat lejárt, az nem lesz megújítva, és acquireTokenSilent sikertelen lesz.
  • CacheLookupPolicy.RefreshTokenAndNetwork - acquireTokenSilent nem fogja a gyorsítótárban keresni a hozzáférési tokent. Közvetlenül a hálózatra megy a gyorsítótárazott frissítési tokennel. Ha a frissítési token lejárt, megkísérlik megújítani. Ez egyenértékű a forceRefresh: truebeállításával.
  • CacheLookupPolicy.Skip - acquireTokenSilent megkísérli megújítani a hozzáférési és a frissítési jogkivonatokat is. Nem jelenik meg a gyorsítótárban. Ez mindig sikertelen lesz, ha a böngésző letiltja a harmadik féltől származó cookie-kat.

Kódrészletek

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)
            }
        });
    }
});

Redirect

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)
    }
});

Következő lépések

Megtudhatja, hogyan hajthat végre kijelentkezéseket.