Okresy istnienia tokenu, wygaśnięcie i odnawianie

Przed rozpoczęciem tutaj upewnij się, że rozumiesz, jak zalogować się i uzyskać tokeny.

Korzystając z MSAL.js, należy zrozumieć implikacje pobierania tokenów dla użytkowników i sposobu zarządzania okresami istnienia tych tokenów.

Okresy istnienia tokenu i wygaśnięcie

Możesz skonfigurować okresy istnienia tokenu dostępu, identyfikatora lub tokenów języka SAML (Security Assertion Markup Language) wystawionych przez Platforma tożsamości Microsoft. Poniżej podsumowano niektóre informacje.

Tokeny uwierzytelniające

Tokeny identyfikatorów są powiązane z określoną kombinacją konta i klienta i zwykle zawierają informacje o profilu użytkownika. Zazwyczaj okres istnienia sesji użytkownika aplikacji internetowej będzie zgodny z okresem istnienia sesji tokenu identyfikatora, czyli domyślnie 24 godziny. Możesz dowiedzieć się więcej na temat konfigurowania okresów istnienia tokenu.

Tokeny dostępu

Tokeny dostępu w przeglądarce mają domyślne zalecane wygaśnięcie 1 godziny. Po upływie tej 1 godziny wszystkie wywołania elementu nośnego z wygasłym tokenem zostaną odrzucone. Ten token można odświeżyć w trybie dyskretnym przy użyciu tokenu odświeżania pobranego z tego tokenu. Możesz dowiedzieć się więcej na temat konfigurowania okresów istnienia tokenu.

Odświeżanie tokenów

Tokeny odświeżania przyznawane aplikacjom jednostronicowym są tokenami odświeżania o ograniczonym czasie ważności (zwykle 24 godziny od momentu ich pobrania). Jest to nienastawne, niesuwne okno, okres istnienia. Za każdym razem, gdy token odświeżania jest używany do odnawiania tokenu dostępu, nowy token odświeżania jest pobierany przy użyciu odnowionego tokenu dostępu. Ten nowy token odświeżania będzie miał okres istnienia równy pozostałemu okresowi istnienia oryginalnego tokenu odświeżania. Po wygaśnięciu tokenu odświeżania należy zainicjować nowy przepływ kodu autoryzacji, aby pobrać kod autoryzacji i wymienić go na nowy zestaw tokenów.

Uwaga: po uzyskaniu nowego tokenu odświeżania msal.js zastępuje buforowany token odświeżania nowym tokenem odświeżania, jednak stary token odświeżania nie jest unieważniany przez serwer i może być nadal używany do uzyskiwania tokenów dostępu do czasu jego wygaśnięcia.

Odnawianie tokenu

Obiekt PublicClientApplication uwidacznia interfejs API o nazwie acquireTokenSilent , który jest przeznaczony do dyskretnego pobierania tokenu, który nie wygasł. Robi to w kilku krokach:

  1. Sprawdź, czy token już istnieje w pamięci podręcznej tokenów dla podanych scopes, client id, authority i/lub homeAccountIdentifier.
  2. Jeśli dla podanych parametrów istnieje token, upewnij się, że znaleziono dokładnie jedno dopasowanie, i sprawdź datę wygaśnięcia.
  3. Jeśli token dostępu nie wygasł, biblioteka MSAL zwróci odpowiedź z odpowiednimi tokenami.
  4. Jeśli token dostępu wygasł, ale token odświeżania jest nadal prawidłowy, biblioteka MSAL użyje danego tokenu odświeżania do pobrania nowego zestawu tokenów, a następnie zwróci odpowiedź.
  5. Jeśli token odświeżania wygasł, biblioteka MSAL spróbuje niejawnie pobrać token dostępu za pomocą ukrytej ramki iframe. Spowoduje to użycie identyfikatora SID lub nazwy użytkownika w obiekcie oświadczeń konta, aby pobrać wskazówkę dotyczącą sesji użytkownika. Jeśli to wywołanie ukrytej ramki iframe zakończy się niepowodzeniem, biblioteka MSAL przekaże błąd z serwera jako InteractionRequiredAuthError, z żądaniem pobrania kodu autoryzacji w celu uzyskania nowego zestawu tokenów. W tym celu można wykonać wywołanie interfejsu API logowania lub interfejsu API acquireToken za pomocą obiektu PublicClientApplication. Jeśli sesja jest nadal aktywna, serwer wyśle kod bez monitów użytkownika. W przeciwnym razie użytkownik będzie musiał podać swoje dane logowania.

Zobacz artykuł dotyczący obiektów żądań i odpowiedzi , aby uzyskać więcej informacji na temat parametrów konfiguracji, które można ustawić dla acquireTokenSilent metody.

Unikanie interakcyjnych przerw w trakcie sesji użytkownika

W niektórych przypadkach możesz chcieć wywołać interakcję z wyprzedzeniem, w razie potrzeby, na początku sesji użytkownika, aby upewnić się, że mogą nadal uzyskiwać tokeny w trybie dyskretnym i korzystać z aplikacji bez dalszych przerw. Można to oczywiście osiągnąć, wywołując interakcję przy każdym pierwszym załadowaniu aplikacji, jednak zapewnia to słabe wrażenia użytkownika i jest mniej wydajne, gdy użytkownik ma już tokeny z poprzedniej sesji albo z innego okna lub karty. Zamiast tego, za pomocą kilku parametrów żądania, można użyć acquireTokenSilent, aby zapewnić, że w pamięci podręcznej są dostępne niezbędne tokeny, które można zwrócić bez interakcji przez dowolnie długi czas.

Aby zapewnić, że acquireTokenSilent może zwracać prawidłowe tokeny przez okres do 1 godziny:

  • Wywołaj acquireTokenSilent podczas ładowania strony, ustawiając parametr żądania forceRefresh na true. Spowoduje to pominięcie pamięci podręcznej i uzyskanie nowego tokenu, który można następnie obsłużyć z pamięci podręcznej podczas kolejnych wywołań.
  • Po kolejnych wywołaniach pozostaw forceRefresh bez ustawienia lub jawnie false , aby upewnić się, że tokeny mogą być obsługiwane z pamięci podręcznej

Aby zapewnić, że element acquireTokenSilent będzie mógł zwracać prawidłowe tokeny przez minimalny okres do 24 godzin:

  • Wywołaj acquireTokenSilent podczas ładowania strony, ustawiając parametr żądania forceRefresh na true oraz parametr refreshTokenExpirationOffsetSeconds na żądany czas trwania (w sekundach) bez interakcji
  • Przy kolejnych wywołaniach pozostaw forceRefresh i refreshTokenExpirationOffsetSeconds nieustawione, aby tokeny mogły być pobierane z pamięci podręcznej

Jeśli na przykład chcesz upewnić się, że użytkownik może uzyskać tokeny dyskretnie przez następne 2 godziny:

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

Uwaga: nigdy nie ma gwarancji, że token można uzyskać dyskretnie, nawet jeśli token odświeżania nie wygasł jeszcze. Opisane powyżej wzorce są najlepszymi próbami zminimalizowania interakcji w niewygodnych czasach, ale nie eliminują możliwości wymaganych interakcji w żądanych przedziałach czasu. Ponadto nie wszyscy dostawcy tożsamości zwracają czas wygaśnięcia tokenu odświeżania — w takich przypadkach parametr żądania refreshTokenExpirationOffsetSeconds nie będzie uwzględniany.

Zasada wyszukiwania w pamięci podręcznej

Do żądania można opcjonalnie podać zasady wyszukiwania pamięci podręcznej. Zasady wyszukiwania w pamięci podręcznej to:

  • CacheLookupPolicy.Default - acquireTokenSilent program podejmie próbę pobrania tokenu dostępu z pamięci podręcznej. Jeśli token dostępu wygasł lub nie można go odnaleźć, token odświeżania zostanie użyty do uzyskania nowego. Na koniec, jeśli token odświeżania wygasł, acquireTokenSilent spróbuje w trybie dyskretnym uzyskać nowy token dostępu, token identyfikatora i token odświeżania.
  • CacheLookupPolicy.AccessToken - acquireTokenSilent będzie wyszukiwać tylko tokeny dostępu w pamięci podręcznej. Nie podejmie próby odnowienia tokenów dostępu ani odświeżania.
  • CacheLookupPolicy.AccessTokenAndRefreshToken - acquireTokenSilent program podejmie próbę pobrania tokenu dostępu z pamięci podręcznej. Jeśli token dostępu wygasł lub nie można go odnaleźć, token odświeżania zostanie użyty do uzyskania nowego. Jeśli token odświeżania wygasł, nie zostanie odnowiony i acquireTokenSilent zakończy się niepowodzeniem.
  • CacheLookupPolicy.RefreshToken - acquireTokenSilent Program nie podejmie próby pobrania tokenów dostępu z pamięci podręcznej i zamiast tego podejmie próbę wymiany buforowanego tokenu odświeżania dla nowego tokenu dostępu. Jeśli token odświeżania wygasł, nie zostanie odnowiony i acquireTokenSilent zakończy się niepowodzeniem.
  • CacheLookupPolicy.RefreshTokenAndNetwork - acquireTokenSilent nie będzie szukać tokenu dostępu w pamięci podręcznej. Połączy się bezpośrednio z siecią przy użyciu buforowanego tokenu odświeżania. Jeśli token odświeżania wygasł, zostanie podjęta próba jego odnowienia. Jest to odpowiednik ustawienia forceRefresh: true.
  • CacheLookupPolicy.Skip - acquireTokenSilent podejmie próbę odnowienia zarówno tokenów dostępu, jak i tokenów odświeżania. Nie będzie sprawdzać pamięci podręcznej. To zawsze zakończy się niepowodzeniem, jeśli pliki cookie innych firm zostaną zablokowane przez przeglądarkę.

Fragmenty kodu

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

Dalsze kroki

Dowiedz się, jak się wylogować.