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.
platí pro: nájemci zaměstnaneckých prostor
externí nájemci (další informace)
Vzor pro získání tokenů pro rozhraní API s MSAL.js spočívá v prvním pokusu o požadavek na bezobslužný token pomocí acquireTokenSilent
metody. Při zavolání této metody knihovna nejprve zkontroluje mezipaměť v úložišti prohlížeče a zjistí, jestli neexistuje přístupový token, jehož platnost nevypršela, a vrátí ho. Pokud se nenajde žádný přístupový token nebo platnost nalezeného přístupového tokenu vypršela, pokusí se použít obnovovací token k získání nového přístupového tokenu. Pokud vypršela platnost 24hodinové životnosti obnovovacího tokenu, MSAL.js otevře skrytý iframe, aby tiše požádal o nový autorizační kód pomocí existující aktivní relace s Microsoft Entra ID (pokud existuje), který pak bude vyměněn za novou sadu tokenů (přístupové a obnovovací tokeny).
Další informace o relacích jednotného přihlašování (SSO) a hodnotách životnosti tokenů v Microsoft Entra ID najdete v tématu Životnost tokenů. Další informace o zásadách vyhledávání v mezipaměti MSAL.js najdete v tématu: Získání přístupového tokenu.
Žádosti o bezobslužný token na ID Microsoft Entra můžou selhat z důvodů, jako je změna hesla nebo aktualizace zásad podmíněného přístupu. Častěji jsou selhání způsobená vypršením 24hodinové doby platnosti obnovovacího tokenu a prohlížečem blokujícím soubory cookie třetích stran, což brání použití skrytých elementů iframe k pokračování v ověřování uživatele. V těchto případech byste měli vyvolat jednu z interaktivních metod (která může uživatele vyzvat) k získání tokenů:
-
Automaticky otevírané okno pomocí
acquireTokenPopup
-
Přesměrovat pomocí
acquireTokenRedirect
Volba mezi vyskakovacími okny nebo přesměrováním
Volba mezi automaticky otevírané okno nebo prostředím pro přesměrování závisí na toku aplikace:
- Pokud nechcete, aby se uživatelé během ověřování přesouvají z hlavní stránky aplikace, doporučujeme automaticky otevíranou metodu. Vzhledem k tomu, že přesměrování ověřování probíhá v automaticky otevíraném okně, zachová se stav hlavní aplikace.
- Pokud mají uživatelé omezení prohlížeče nebo zásady, ve kterých jsou automaticky otevíraná okna zakázaná, můžete použít metodu přesměrování. Použijte metodu přesměrování v prohlížeči Internet Explorer, protože existují známé problémy s automaticky otevíranými okny v Internet Exploreru.
Můžete nastavit obory rozhraní API, které chcete, aby přístupový token zahrnoval při vytváření žádosti o přístupový token. V přístupovém tokenu nemusí být uděleny všechny požadované obory. To závisí na souhlasu uživatele.
Získání tokenu s vyskakovacím oknem
Následující kód kombinuje dříve popsaný vzor s metodami pro automaticky otevírané prostředí:
import {
InteractionRequiredAuthError,
InteractionStatus,
} from "@azure/msal-browser";
import { AuthenticatedTemplate, useMsal } from "@azure/msal-react";
function ProtectedComponent() {
const { instance, inProgress, accounts } = useMsal();
const [apiData, setApiData] = useState(null);
useEffect(() => {
if (!apiData && inProgress === InteractionStatus.None) {
const accessTokenRequest = {
scopes: ["user.read"],
account: accounts[0],
};
instance
.acquireTokenSilent(accessTokenRequest)
.then((accessTokenResponse) => {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken).then((response) => {
setApiData(response);
});
})
.catch((error) => {
if (error instanceof InteractionRequiredAuthError) {
instance
.acquireTokenPopup(accessTokenRequest)
.then(function (accessTokenResponse) {
// Acquire token interactive success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken).then((response) => {
setApiData(response);
});
})
.catch(function (error) {
// Acquire token interactive failure
console.log(error);
});
}
console.log(error);
});
}
}, [instance, accounts, inProgress, apiData]);
return <p>Return your protected content here: {apiData}</p>;
}
function App() {
return (
<AuthenticatedTemplate>
<ProtectedComponent />
</AuthenticatedTemplate>
);
}
Případně pokud potřebujete získat token mimo komponentu React, můžete volat acquireTokenSilent
, ale pokud selže, neměli byste se k interakci vrátit. Všechny interakce by se měly provádět pod komponentou MsalProvider
ve stromu komponent.
// MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
const account = publicClientApplication.getAllAccounts()[0];
const accessTokenRequest = {
scopes: ["user.read"],
account: account,
};
// Use the same publicClientApplication instance provided to MsalProvider
publicClientApplication
.acquireTokenSilent(accessTokenRequest)
.then(function (accessTokenResponse) {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken);
})
.catch(function (error) {
//Acquire token silent failure
console.log(error);
});
Získání tokenu s přesměrováním
Pokud acquireTokenSilent
selže, přejděte zpět na acquireTokenRedirect
. Tato metoda zahájí úplné přesměrování a odpověď bude zpracována při návratu do aplikace. Když se tato komponenta vykreslí po návratu z přesměrování, acquireTokenSilent
by nyní měl uspět, protože tokeny se načítají z mezipaměti.
import {
InteractionRequiredAuthError,
InteractionStatus,
} from "@azure/msal-browser";
import { AuthenticatedTemplate, useMsal } from "@azure/msal-react";
function ProtectedComponent() {
const { instance, inProgress, accounts } = useMsal();
const [apiData, setApiData] = useState(null);
useEffect(() => {
const accessTokenRequest = {
scopes: ["user.read"],
account: accounts[0],
};
if (!apiData && inProgress === InteractionStatus.None) {
instance
.acquireTokenSilent(accessTokenRequest)
.then((accessTokenResponse) => {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken).then((response) => {
setApiData(response);
});
})
.catch((error) => {
if (error instanceof InteractionRequiredAuthError) {
instance.acquireTokenRedirect(accessTokenRequest);
}
console.log(error);
});
}
}, [instance, accounts, inProgress, apiData]);
return <p>Return your protected content here: {apiData}</p>;
}
function App() {
return (
<AuthenticatedTemplate>
<ProtectedComponent />
</AuthenticatedTemplate>
);
}
Případně pokud potřebujete získat token mimo komponentu React, můžete volat acquireTokenSilent
, ale pokud selže, neměli byste se k interakci vrátit. Všechny interakce by se měly provádět pod komponentou MsalProvider
ve stromu komponent.
// MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
const account = publicClientApplication.getAllAccounts()[0];
const accessTokenRequest = {
scopes: ["user.read"],
account: account,
};
// Use the same publicClientApplication instance provided to MsalProvider
publicClientApplication
.acquireTokenSilent(accessTokenRequest)
.then(function (accessTokenResponse) {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken);
})
.catch(function (error) {
//Acquire token silent failure
console.log(error);
});