Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
- Sprawdź, czy token już istnieje w pamięci podręcznej tokenów dla podanych
scopes,client id,authorityi/lubhomeAccountIdentifier. - Jeśli dla podanych parametrów istnieje token, upewnij się, że znaleziono dokładnie jedno dopasowanie, i sprawdź datę wygaśnięcia.
- Jeśli token dostępu nie wygasł, biblioteka MSAL zwróci odpowiedź z odpowiednimi tokenami.
- 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ź.
- 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ą obiektuPublicClientApplication. 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
acquireTokenSilentpodczas ładowania strony, ustawiając parametr żądaniaforceRefreshnatrue. 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
forceRefreshbez ustawienia lub jawniefalse, 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
acquireTokenSilentpodczas ładowania strony, ustawiając parametr żądaniaforceRefreshnatrueoraz parametrrefreshTokenExpirationOffsetSecondsna żądany czas trwania (w sekundach) bez interakcji - Przy kolejnych wywołaniach pozostaw
forceRefreshirefreshTokenExpirationOffsetSecondsnieustawione, 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-acquireTokenSilentprogram 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ł,acquireTokenSilentspróbuje w trybie dyskretnym uzyskać nowy token dostępu, token identyfikatora i token odświeżania. -
CacheLookupPolicy.AccessToken-acquireTokenSilentbę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-acquireTokenSilentprogram 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 iacquireTokenSilentzakończy się niepowodzeniem. -
CacheLookupPolicy.RefreshToken-acquireTokenSilentProgram 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 iacquireTokenSilentzakończy się niepowodzeniem. -
CacheLookupPolicy.RefreshTokenAndNetwork-acquireTokenSilentnie 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 ustawieniaforceRefresh: true. -
CacheLookupPolicy.Skip-acquireTokenSilentpodejmie 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
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)
}
});
}
});
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ć.