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.
BrowserConfigurationAuthErrors
byla_volána_stubovaná_veřejná_klientská_aplikace
Chybová zpráva: Byla volána zástupná instance veřejné klientské aplikace. Pokud používáte msal-react, ujistěte se, že se kontext nepoužívá bez provideru.
Zobrazení chyb msal-react
BrowserAuthErrors
Interakce_probíhá
Chybová zpráva: Probíhá interakce. Před voláním interaktivního rozhraní API se ujistěte, že byla tato interakce dokončena.
Tato chyba se vyvolá, když se vyvolá interaktivní rozhraní API (loginPopup, loginRedirectacquireTokenPopup, ), acquireTokenRedirectzatímco probíhá jiné interaktivní rozhraní API. Rozhraní API pro přihlášení a získáníTokenu jsou asynchronní, takže budete muset zajistit, aby se výsledné přísliby vyřešily před vyvoláním jiného.
Použití loginPopup nebo acquireTokenPopup
Před vyvoláním jiného z těchto rozhraní API se ujistěte, že se příslib vrácený z těchto rozhraní API vyřešil.
❌ Následující příklad vyvolá tuto chybu, protože loginPopup bude v době, kdy je zavoláno acquireTokenPopup, stále probíhat:
const request = { scopes: ["openid", "profile"] };
loginPopup();
acquireTokenPopup(request);
✔️ Pokud chcete tento problém vyřešit, měli byste před vyvoláním jiného rozhraní API zajistit, aby se vyřešila všechna interaktivní rozhraní API:
const request = { scopes: ["openid", "profile"] };
await msalInstance.loginPopup();
await msalInstance.acquireTokenPopup(request);
Použití loginRedirect nebo acquireTokenRedirect
Při použití rozhraní API pro přesměrování je při návratu z přesměrování nutné vyvolat handleRedirectPromise. Tím se zajistí, že se správně zpracuje odpověď tokenu ze serveru a vyčistí se dočasné položky mezipaměti. K této chybě dojde, pokud handleRedirectPromise neměl možnost dokončit se dříve, než aplikace vyvolá loginRedirect nebo acquireTokenRedirect.
❌ Následující příklad vyvolá tuto chybu, protože handleRedirectPromise bude stále zpracovávat odpověď z předchozího loginRedirect volání, když loginRedirect se volá 2. čas:
msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
✔️ Chcete-li tento problém vyřešit, měli byste před voláním jakéhokoli interaktivního rozhraní API počkat, až se handleRedirectPromise vyřeší:
await msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
Nebo alternativně:
msalInstance
.handleRedirectPromise()
.then((tokenResponse) => {
if (!tokenResponse) {
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
} else {
// Do something with the tokenResponse
}
})
.catch((err) => {
// Handle error
console.error(err);
});
Poznámka: Pokud voláte loginRedirect nebo acquireTokenRedirect ze stránky, která není vaší redirectUri, musíte zajistit, aby bylo volání handleRedirectPromise provedeno a aby se na jeho dokončení čekalo jak na stránce redirectUri, tak na stránce, ze které jste přesměrování zahájili. Důvodem je to, že redirectUri stránka zahájí přesměrování zpět na stránku, která byla původně vyvolána loginRedirect , a tato stránka zpracuje odpověď tokenu.
Obalové knihovny
Pokud používáte některou z našich knihoven obálky (React nebo Angular), projděte si dokumentaci k chybám v těchto konkrétních knihovnách z dalších důvodů, proč se může zobrazit tato chyba:
Pokud nepoužíváte žádnou z knihoven obálky, ale zajímá vás, že vaše aplikace může aktivovat souběžné interaktivní požadavky, měli byste před vyvoláním interakce v metodě získání tokenu zkontrolovat, jestli neprobíhá nějaká jiná interakce. Toho můžete dosáhnout implementací globálního stavu aplikace nebo služby pro rozesílání událostí atd., která prostřednictvím MSAL Events API publikuje aktuální stav interakce MSAL.
❌ Následující příklad vyvolá tuto chybu, protože acquireTokenPopup v bloku catch nekontroluje, jestli v tuto chvíli probíhá jiná interakce:
async function myAcquireToken(request) {
const msalInstance = getMsalInstance(); // get the msal application instance
const tokenRequest = {
account: msalInstance.getActiveAccount() || null;
...request
};
let tokenResponse;
try {
// attempt silent acquisition first
tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
} catch (error) {
if (error instanceof InteractionRequiredAuthError) {
try {
tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
} catch (err) {
console.log(err);
// handle other errors
}
}
console.log(error);
// handle other errors
}
return tokenResponse;
};
const request = {
scopes: ["User.Read"]
};
myAcquireToken(request);
myAcquireToken(request);
✔️ Pokud chcete problém vyřešit, měli byste před voláním jakéhokoli jiného interaktivního rozhraní API počkat na stav None interakce:
async function myAcquireToken(request) {
const msalInstance = getMsalInstance(); // get the msal application instance
const tokenRequest = {
account: msalInstance.getActiveAccount() || null;
...request
};
let tokenResponse;
try {
// attempt silent acquisition first
tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
} catch (error) {
if (error instanceof InteractionRequiredAuthError) {
// check for any interactions
if (myGlobalState.getInteractionStatus() !== InteractionStatus.None) {
// throw a new error to be handled in the caller below
throw new Error("interaction_in_progress");
} else {
// no interaction, invoke popup flow
tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
}
}
console.log(error);
// handle other errors
}
return tokenResponse;
};
async function myInteractionInProgressHandler() {
/**
* "myWaitFor" method polls the interaction status via getInteractionStatus() from
* the application state and resolves when it's equal to "None".
*/
await myWaitFor(() => myGlobalState.getInteractionStatus() === InteractionStatus.None);
// wait is over, call myAcquireToken again to re-try acquireTokenSilent
return (await myAcquireToken(tokenRequest));
};
const request = {
scopes: ["User.Read"]
};
myAcquireToken(request).catch((e) => myInteractionInProgressHandler());
myAcquireToken(request).catch((e) => myInteractionInProgressHandler());
Postup při řešení problémů
-
Povolte podrobné protokolování a sledujte pořadí událostí. Ověřte, že je voláno
handleRedirectPromisea že se vrátí před voláním jakéhokoli rozhraní APIloginneboacquireToken.
Pokud nemůžete zjistit, proč k této chybě dochází, otevřete problém a připravte se na sdílení následujících informací:
- Podrobné protokoly
- Ukázková aplikace nebo fragmenty kódu, které můžeme použít k reprodukci problému
- Aktualizujte stránku. Zmizí chyba?
- Otevřete aplikaci v nové kartě. Zmizí chyba?
block_iframe_reload
Chybová zpráva: Požadavek byl zablokován uvnitř prvku iframe, protože služba MSAL zjistila odpověď na ověření.
K této chybě dochází při volání ssoSilent nebo acquireTokenSilent, pokud se stránka použitá jako redirectUri pokouší vyvolat funkci přihlášení nebo acquireToken.
Naším doporučeným řešením v tomto případě je nastavit jako redirectUri prázdnou stránku, která při volání tichých rozhraní API nepoužívá MSAL. To bude mít také další výhodu v podobě zlepšení výkonu, protože skrytý iframe nemusí vaši stránku vykreslovat.
✔️ Můžete to provést na základě jednotlivých požadavků, například:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Nezapomeňte, že tento nový redirectUri budete muset zaregistrovat ve vaší registraci aplikace.
Pokud pro tento účel nechcete použít vyhrazené redirectUri, měli byste místo toho zajistit, aby se vaše redirectUri při vykreslení uvnitř skrytého prvku iframe používaného tichými rozhraními API nepokoušela volat rozhraní API MSAL.
časový_limit_okna_monitoru
Chybové zprávy:
- Získání tokenu v rámci iframe selhalo kvůli vypršení časového limitu.
Tato chyba může být vyvolána při volání ssoSilent, acquireTokenSilent, acquireTokenPopup nebo loginPopup a může k tomu dojít z několika důvodů. Jedná se o několik nejběžnějších:
- Stránka, kterou používáte jako
redirectUri, odstraňuje nebo upravuje hash - Stránka, kterou používáte jako
redirectUri, se automaticky přesměrovává na jinou stránku. - Jste omezováni svým poskytovatelem identity
- Váš poskytovatel identity vás nepřesměroval zpět na
redirectUri.
Důležité: Pokud vaše aplikace používá směrovací knihovnu (např. React Router, Angular Router), ujistěte se, že během získávání tokenu MSAL neodstraní hash ani automaticky nepřesměruje. Pokud je to možné, je nejlepší, když vaše stránka redirectUri vůbec nevolá router.
Problémy způsobené stránkou redirectUri
Při tichém volání se v některých případech otevře iframe, který bude přesměrován na autorizační stránku vašeho poskytovatele identity. Jakmile zprostředkovatel identity autorizuje uživatele, přesměruje iframe zpět na redirectUri s autorizačním kódem nebo informacemi o chybě ve fragmentu hashe. Instance MSAL spuštěná v rámci nebo v okně, ze kterého byl původně odeslán požadavek, extrahuje tento hash odpovědi a zpracuje ho. Pokud váš redirectUri tento hash odstraňuje, manipuluje s ním nebo přesměrovává na jinou stránku dříve, než ho MSAL extrahuje, zobrazí se tato chyba vypršení časového limitu.
✔️ Chcete-li tento problém vyřešit, měli byste zajistit, aby stránka, kterou používáte, protože redirectUri neprovádí žádnou z těchto věcí, přinejmenším při načtení do automaticky otevíraného okna nebo prvku iframe. Jako tiché a automaticky otevírané toky doporučujeme použít prázdnou stránku redirectUri , aby se zajistilo, že k těmto věcem nedojde.
Můžete to provést na základě jednotlivých požadavků, například:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Nezapomeňte, že tento nový redirectUri budete muset zaregistrovat ve vaší registraci aplikace.
Poznámky týkající se Angularu a Reactu:
- Pokud používáte
@azure/msal-angular, vaše stránkaredirectUriby neměla být chráněna pomocíMsalGuard. - Pokud používáte
@azure/msal-react, vaše stránkaredirectUriby neměla vykreslitMsalAuthenticationComponentani používat hookuseMsalAuthentication.
Problémy způsobené zprostředkovatelem identity
Throttling
Jedním z nejběžnějších důvodů, proč může být tato chyba vyvoláná, je to, že se vaše aplikace zablokovala ve smyčce nebo za krátkou dobu provedla příliš mnoho žádostí o tokeny. Když k tomu dojde, může poskytovatel identity na krátkou dobu omezit následné požadavky, což bude mít za následek, že nebudete přesměrováni zpět na vaši redirectUri a nakonec se zobrazí tato chyba.
✔️ Chcete-li vyřešit problémy způsobené omezením rychlosti, máte 2 možnosti:
- Než to zkusíte znovu, přestaňte na chvíli odesílat požadavky.
- Vyvolání interaktivního rozhraní API, například
acquireTokenPopupneboacquireTokenRedirect.
X-Frame-Options Odepřít
Tato chyba se může zobrazit také v případě, že se zprostředkovateli identity nepodaří přesměrovat zpět do vaší aplikace. V bezobslužných scénářích je tato chyba někdy doprovázena chybou X-Frame-Options: Deny, která signalizuje, že se váš poskytovatel identity pokouší zobrazit chybovou zprávu nebo očekává interakci.
✔️ Chyba X-Frame-Options obvykle obsahuje adresu URL a otevření této adresy URL v nové kartě vám může pomoci pochopit, co se děje. Pokud se vyžaduje interakce, zvažte místo toho použití interaktivního rozhraní API. Pokud se zobrazí chyba, vyřešte chybu.
Očekává se, že některé toky B2C tuto chybu vyvolají kvůli potřebě interakce uživatelů. Mezi tyto toky patří:
- Resetování hesla
- Úpravy profilu
- Zaregistrujte se
- Některé vlastní zásady v závislosti na jejich konfiguraci
Síťová latence
Dalším možným důvodem, proč poskytovatel identity nemusí včas přesměrovat zpět do vaší aplikace, může být dodatečná latence v síti.
✔️ Výchozí časový limit je přibližně 10 sekund a ve většině případů by měl být dostatečný. Pokud však vašemu zprostředkovateli identity přesměrování trvá déle, můžete tento časový limit v konfiguraci MSAL zvýšit pomocí konfiguračních parametrů iframeHashTimeout, windowHashTimeout nebo loadFrameTimeout.
const msalConfig = {
auth: {
clientId: "your-client-id",
},
system: {
windowHashTimeout: 9000, // Applies just to popup calls - In milliseconds
iframeHashTimeout: 9000, // Applies just to silent calls - In milliseconds
loadFrameTimeout: 9000, // Applies to both silent and popup calls - In milliseconds
},
};
hash_empty_error
Chybové zprávy:
Hodnotu hash nelze zpracovat, protože je prázdná. Ověřte, že vaše redirectUri neodstraňuje hash.
K této chybě dochází, když stránka, kterou používáte jako redirectUri, odstraňuje hash nebo automaticky přesměrovává na jinou stránku. K tomu nejčastěji dochází, když aplikace implementuje směrovač, který přejde na jinou trasu a zahodí hodnotu hash.
Pokud chcete tuto chybu vyřešit, doporučujeme použít vyhrazenou stránku redirectUri, která není předmětem směrovače. Pro tiché a automaticky otevírané volání je nejlepší použít prázdnou stránku. Pokud to není možné, ujistěte se, že router během získávání tokenu MSAL neprovádí navigaci. Můžete to provést tak, že zjistíte, zda je vaše aplikace načtená v prvku iframe pro tichá volání, ve vyskakovacím okně pro volání ve vyskakovacím okně nebo čekáním na handleRedirectPromise pro volání pomocí přesměrování.
hash_does_not_contain_known_properties
Chybové zprávy:
Hash neobsahuje žádné známé vlastnosti. Ověřte, že identifikátor redirectUri nemění hodnotu hash.
Viz vysvětlení hash_empty_error výše. Původní příčina této chyby je podobná, rozdíl v tom, že hodnota hash se změnila, a nikoli se zahodila.
nelze získat token z nativní platformy
Chybové zprávy:
- Token nelze získat z nativní platformy.
Tato chyba se vyvolá při volání rozhraní API acquireTokenByCode s nativeAccountId místo code, když aplikace běží v prostředí, které nezískává tokeny z nativního zprostředkovatele. Seznam požadavků najdete v dokumentaci k tokenům vázaným na zařízení.
native_connection_not_established
Chybové zprávy:
- Připojení k nativní platformě nebylo vytvořeno. Nainstalujte kompatibilní rozšíření prohlížeče a spusťte inicializaci().
Tato chyba se vyvolá, když se uživatel přihlásil pomocí nativního zprostředkovatele, ale v současné době neexistuje žádné připojení k nativnímu zprostředkovateli. Tato chyba může mít následující důvody:
- Rozšíření Windows Accounts bylo odinstalováno nebo zakázáno.
- Rozhraní
initializeAPI nebylo voláno nebo nebylo očekáváno před vyvoláním jiného rozhraní MSAL API.
uninitialized_public_client_application
Chybové zprávy:
- Předtím, než se pokusíte volat jakékoli jiné rozhraní API MSAL, musíte zavolat funkci initialize a počkat na její dokončení.
Tato chyba se vyvolá, když je rozhraní API login, acquireToken nebo handleRedirectPromise voláno před zavoláním rozhraní API initialize. Před initialize pokusem o získání tokenů musí být rozhraní API voláno a očekáváno.
❌ Následující příklad vyvolá tuto chybu, protože handleRedirectPromise je volána před dokončením inicializace:
const msalInstance = new PublicClientApplication({
auth: {
clientId: "your-client-id",
},
system: {
allowNativeBroker: true,
},
});
await msalInstance.handleRedirectPromise(); // This will throw
msalInstance.acquireTokenSilent(); // This will also throw
✔️ Chcete-li to vyřešit, měli byste před voláním jakéhokoli jiného rozhraní API MSAL počkat, až se initialize dokončí:
const msalInstance = new PublicClientApplication({
auth: {
clientId: "your-client-id",
},
system: {
allowNativeBroker: true,
},
});
await msalInstance.initialize();
await msalInstance.handleRedirectPromise(); // This will no longer throw this error since initialize completed before this was invoked
msalInstance.acquireTokenSilent(); // This will also no longer throw this error
Other
Chyby nevyvolané knihovnou MSAL, například chyby serveru
Zásady CORS zablokovaly přístup k načtení na adrese [url]
K této chybě dochází u MSAL.js v2.x a je způsobená nesprávnou konfigurací při registraci aplikace v Azure Portal. Konkrétně byste měli zajistit, aby byl váš redirectUri zaregistrován jako typ: Single-page application v okně Ověřování v registraci vaší aplikace. Pokud se úspěšně dokončilo, zobrazí se zelené zaškrtnutí, které říká:
Váš identifikátor URI pro přesměrování lze použít pro tok autorizačního kódu s PKCE.