Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
BrowserConfigurationAuthErrors
meghívott_csonkolt_nyilvános_ügyfélalkalmazás
Hibaüzenet: A nyilvános kliensalkalmazás csonkpéldányát hívták meg. Ha az msal-reactet használja, kérjük, ügyeljen arra, hogy a kontextust ne használja provider nélkül.
Msal-react hibák megtekintése
BrowserAuthErrors
Interakció_folyamatban
Hibaüzenet: Az interakció jelenleg folyamatban van. Az interaktív API meghívása előtt győződjön meg arról, hogy ez az interakció befejeződött.
Ez a hiba akkor jelentkezik, ha egy interaktív API (loginPopup, loginRedirect, , acquireTokenPopupacquireTokenRedirect) meghívása közben egy másik interaktív API is folyamatban van. A bejelentkezési és a acquireToken API-k aszinkronok, ezért gondoskodnia kell arról, hogy az eredményül kapott ígéretek feloldódjanak egy másik meghívás előtt.
Használva loginPopup vagy acquireTokenPopup
Győződjön meg róla, hogy az ezekből az API-kból visszaadott Promise teljesült, mielőtt egy másik API-t meghívna.
❌ Az alábbi példa ezt a hibát fogja eredményezni, mert a(z) loginPopup még mindig folyamatban lesz, amikor a(z) acquireTokenPopup meghívásra kerül:
const request = { scopes: ["openid", "profile"] };
loginPopup();
acquireTokenPopup(request);
✔️ A probléma megoldásához győződjön meg arról, hogy az összes interaktív API fel lett oldva, mielőtt egy másikat invált:
const request = { scopes: ["openid", "profile"] };
await msalInstance.loginPopup();
await msalInstance.acquireTokenPopup(request);
Használva loginRedirect vagy acquireTokenRedirect
Átirányítási API-k használatakor az átirányításból való visszatéréskor meg kell hívni a(z) handleRedirectPromise elemet. Ez biztosítja, hogy a kiszolgálótól érkező tokenválasz megfelelően legyen feldolgozva, és az ideiglenes gyorsítótár-bejegyzések el legyenek távolítva. Ez a hiba akkor jelenik meg, ha handleRedirectPromise nem volt lehetősége befejezni, mielőtt az alkalmazás meghívja loginRedirect vagy acquireTokenRedirect.
❌ Az alábbi példában ez a hiba jelenik meg, mert handleRedirectPromise a rendszer továbbra is feldolgozni fogja az előző loginRedirect hívás válaszát, amikor loginRedirect a rendszer 2. alkalommal hívja meg:
msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
✔️ A probléma megoldásához várja meg, amíg a(z) handleRedirectPromise befejeződik, mielőtt bármilyen interaktív API-t meghívna:
await msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
Vagy másik lehetőségként:
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);
});
Megjegyzés: Ha a loginRedirect vagy acquireTokenRedirect elemet egy olyan oldalról hívja meg, amely nem az Ön redirectUri oldala, akkor gondoskodnia kell arról, hogy a handleRedirectPromise meghívása megtörténjen, és meg is várja annak befejezését mind a redirectUri oldalon, mind azon az oldalon, amelyről az átirányítást kezdeményezte. Ennek az az oka, hogy a redirectUri oldal visszairányítást indít vissza arra az oldalra, amely eredetileg meghívta a loginRedirect elemet, és ez az oldal fel fogja dolgozni a tokenválaszt.
Burkolókönyvtárak
Ha az egyik burkolótárunkat (React vagy Angular) használja, tekintse meg az adott kódtárakban található hibakódokat további okokból, amelyek miatt a következő hibaüzenet jelenhet meg:
Ha nem használja a burkolótárakat, de attól tart, hogy az alkalmazás egyidejű interaktív kéréseket indíthat el, ellenőrizze, hogy van-e más interakció, mielőtt interakciót kezdeményezne a jogkivonat-beszerzési módszerben. Ezt egy globális alkalmazásállapot vagy egy közvetítési szolgáltatás stb. implementálásával érheti el, amely az MSAL Események API-val bocsátja ki az aktuális MSAL interakciós állapotot.
❌ Az alábbi példa ezt a hibát fogja jelezni, mert a acquireTokenPopupfogási blokk nem ellenőrzi, hogy egy másik interakció történik-e jelenleg:
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);
✔️ A probléma megoldásához meg kell várnia az interakció állapotát None , mielőtt bármilyen más interaktív API-t hívna meg:
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());
Hibaelhárítási lépések
-
Részletes naplózás engedélyezése és az események sorrendjének nyomon követése. Ellenőrizze, hogy a(z)
handleRedirectPromisemeg van hívva, és visszatér, mielőtt bármelyikloginvagyacquireTokenAPI meg van hívva.
Ha nem tudja kitalálni, hogy miért jelenik meg ez a hiba, nyisson meg egy problémát , és készüljön fel a következő információk megosztására:
- Részletes naplók
- Mintaalkalmazás és/vagy kódrészletek, amelyekkel reprodukálhatjuk a problémát
- Frissítse az oldalt. Eltűnik a hiba?
- Nyissa meg az alkalmazást egy új lapon. Eltűnik a hiba?
block_iframe_reload
Hibaüzenet: A kérés le lett tiltva egy iframe-ben, mert az MSAL hitelesítési választ észlelt.
Ez a hiba akkor jelentkezik, amikor a(z) ssoSilent vagy acquireTokenSilent meghívása történik, és az Ön redirectUri elemeként használt oldal megpróbál egy login vagy acquireToken függvényt meghívni.
Az erre javasolt megoldásunk az, hogy a(z) redirectUri elemet egy olyan üres oldalra állítsa be, amely nem tartalmaz MSAL-implementációt a csendes API-k meghívásakor. Ez a teljesítmény növelésének további előnye is lesz, mivel a rejtett iframe-nek nem kell renderelnie az oldalt.
✔️ Ezt kérésenként végezheti el, például:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Ne feledje, hogy ezt az új redirectUri elemet regisztrálnia kell az alkalmazás regisztrációjában.
Ha nem szeretne külön erre a célra szolgáló redirectUri-t használni, akkor inkább győződjön meg arról, hogy a redirectUri nem próbálja meghívni az MSAL API-kat, amikor a silent API-k által használt rejtett iframe-ben jelenik meg.
A figyelési ablak időtúllépése
Hibaüzenetek:
- Az iframe-jogkivonatok beszerzése időtúllépés miatt meghiúsult.
Ez a hiba akkor fordulhat elő, amikor a ssoSilent, acquireTokenSilent, acquireTokenPopup vagy loginPopup hívása történik, és ennek több oka is lehet. Ezek a leggyakoribbak:
- Az az oldal, amelyet
redirectUriként használsz, eltávolítja vagy módosítja a hash-t - A használt
redirectUrilap automatikusan másik lapra navigál - Az identitásszolgáltató korlátozza a kéréseit
- Az identitásszolgáltató nem irányította vissza ide:
redirectUri.
Fontos: Ha az alkalmazása útválasztó könyvtárat használ (pl. React Router, Angular Router), ügyeljen arra, hogy az ne távolítsa el a hash-részt, és ne irányítson át automatikusan, miközben folyamatban van az MSAL-jogkivonat lekérése. Ha lehetséges, az a legjobb, ha a(z) redirectUri oldal egyáltalán nem használja a routert.
A redirectUri oldal által okozott problémák
Csendes hívás esetén bizonyos esetekben megnyílik egy iframe, amely az identitásszolgáltató engedélyezési oldalára lép. Miután az identitásszolgáltató engedélyezte a felhasználót, az iframe-et visszairányítja a redirectUri címre, az engedélyezési kóddal vagy a hibára vonatkozó információval a hash fragmentumban. Az eredetileg a kérést tartalmazó keretben vagy ablakban futó MSAL-példány kinyeri és feldolgozza ezt a válaszkivonatot. Ha a(z) redirectUri eltávolítja vagy módosítja ezt a hash-értéket, vagy egy másik oldalra navigál, mielőtt az MSAL kiolvasná azt, ezt az időtúllépési hibát kapja.
✔️ A probléma megoldásához győződjön meg arról, hogy a használt redirectUri lap nem végez ilyen műveleteket, legalábbis akkor, ha felugró vagy iframe-be van töltve. Javasoljuk, hogy a csendes és előugró folyamatokhoz redirectUri üres oldalt használjon, így ezek egyike sem fordulhat elő.
Ezt kérésenként végezheti el, például:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Ne feledje, hogy ezt az új redirectUri elemet regisztrálnia kell az alkalmazás regisztrációjában.
Megjegyzések az Angular és a React kapcsán:
- Ha a
@azure/msal-angularhasználja, az ÖnredirectUrioldala ne legyen védve aMsalGuardáltal. - Ha a(z)
@azure/msal-reactelemet használja, a(z)redirectUrioldalnak nem szabad renderelnie a(z)MsalAuthenticationComponentelemet, és nem szabad használnia a(z)useMsalAuthenticationhookot.
Az identitásszolgáltató által okozott problémák
Throttling
Ennek a hibának az egyik leggyakoribb oka az, hogy az alkalmazás végtelen ciklusba került, vagy rövid idő alatt túl sok tokenkérést küldött. Ha ez történik, az identitásszolgáltató rövid időre korlátozhatja a további kérések feldolgozását, ami azt eredményezheti, hogy a rendszer nem irányítja vissza a(z) redirectUri helyre, ami végül ehhez a hibához vezet.
✔️ A szabályozáson alapuló problémák megoldásához két lehetősége van:
- Az ismételt próbálkozás előtt rövid időre hagyja abba a kérések küldését.
- Interaktív API meghívása, például
acquireTokenPopupvagyacquireTokenRedirect.
X-Frame-Options megtagadás
Ezt a hibát akkor is megkaphatja, ha az identitásszolgáltató nem tud visszairányítást végrehajtani az alkalmazásba. Interakciómentes esetekben ezt a hibát néha egy „X-Frame-Options: Deny” hiba is kíséri, ami azt jelzi, hogy az identitásszolgáltató vagy hibaüzenetet próbál megjeleníteni, vagy felhasználói interakcióra számít.
✔️ Az X-Frame-Options hiba általában tartalmaz egy URL-címet, és az URL-cím új lapon való megnyitása segíthet felismerni a történéseket. Ha interakcióra van szükség, fontolja meg inkább egy interaktív API használatát. Ha hiba jelenik meg, a hibát kezelje.
Néhány B2C-folyamat várhatóan ezt a hibát okozza, mivel felhasználói beavatkozásra van szükség. Ezek a folyamatok a következők:
- Új jelszó létrehozása
- Profil szerkesztése
- Regisztráció
- Egyes egyéni szabályzatok a konfigurálásuk módjától függően
Hálózati késés
Egy másik lehetséges ok, amiért az identitásszolgáltató esetleg nem irányítja vissza időben az alkalmazásába, az lehet, hogy további hálózati késleltetés lép fel.
✔️ Az alapértelmezett időtúllépés körülbelül 10 másodperc, és a legtöbb esetben elegendőnek kell lennie, azonban ha az identitásszolgáltató ennél hosszabb időt vesz igénybe az átirányításhoz, akkor ezt az időtúllépést növelheti az MSAL konfigurációjában a , iframeHashTimeout vagy windowHashTimeout a loadFrameTimeoutkonfigurációs paraméterekkel.
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
Hibaüzenetek:
A hash értéket nem lehet feldolgozni, mert üres. Ellenőrizze, hogy a redirectUri nem távolítja-e el a hash-t.
Ez a hiba akkor fordul elő, ha az átirányításiuriként használt lap eltávolítja a kivonatot, vagy automatikusan átirányít egy másik lapra. Ez leggyakrabban akkor fordul elő, amikor az alkalmazás olyan útvonalkezelést valósít meg, amely egy másik útvonalra navigál, és elhagyja a hash-részt.
A hiba elhárításához azt javasoljuk, hogy használjon egy dedikált redirectUri oldalt, amelyre nem vonatkozik az útválasztó. Csendes és előugró hívások esetén a legjobb, ha üres lapot használ. Ha ez nem lehetséges, győződjön meg arról, hogy a router ne végezzen navigációt, amíg az MSAL-token lekérése folyamatban van. Ezt úgy teheti meg, hogy megállapítja, az alkalmazása iframe-ben van-e betöltve a silent hívásokhoz, előugró ablakban van-e betöltve a popup hívásokhoz, vagy a redirect hívásokhoz megvárja a handleRedirectPromise elemet.
A hash nem tartalmaz ismert tulajdonságokat.
Hibaüzenetek:
A hash nem tartalmaz ismert tulajdonságokat. Ellenőrizze, hogy a redirectUri nem módosítja a hash részt.
Lásd a fenti hash_empty_error magyarázatát. A hiba gyökérokának természete hasonló; a különbség az, hogy a hash értéket megváltoztatták, nem pedig eltávolították.
nem sikerült tokent lekérni a natív platformról
Hibaüzenetek:
- Nem sikerült lekérni a tokent a natív platformról.
Ez a hiba akkor jelentkezik, amikor a acquireTokenByCode API meghívása code helyett a nativeAccountId használatával történik, és az alkalmazás olyan környezetben fut, amely nem szerez be tokeneket a natív brokertől. Az előfeltételek listájához tekintse át az eszközhöz kötött tokenekről szóló dokumentumot.
natív kapcsolat nincs létrehozva
Hibaüzenetek:
- Nem jött létre kapcsolat a natív platformmal. Telepítsen egy kompatibilis böngészőbővítményt, és futtassa az inicializálás() parancsot.
Ez a hiba akkor jelenik meg, ha a felhasználó bejelentkezett a natív közvetítővel, de jelenleg nincs kapcsolat a natív közvetítővel. Ez a következő okok miatt történhet:
- A Windows-fiókok bővítményt eltávolították vagy letiltották
- Az
initializeAPI-t nem hívták meg, vagy nem várták meg egy másik MSAL API meghívása előtt
uninitialized_public_client_application
Hibaüzenetek:
- Minden más MSAL API meghívása előtt meg kell hívnia és várnia kell az inicializálási függvényt.
Ez a hiba akkor jelentkezik, ha a login, acquireToken vagy handleRedirectPromise API valamelyikét a initialize API meghívása előtt hívják meg. A tokenek beszerzésének megkísérlése előtt meg kell hívni a initialize API-t, és meg kell várni, hogy a hívás befejeződjön.
❌ Az alábbi példa ezt a hibát fogja jelezni, mert handleRedirectPromise a program az inicializálás befejezése előtt hívja meg:
const msalInstance = new PublicClientApplication({
auth: {
clientId: "your-client-id",
},
system: {
allowNativeBroker: true,
},
});
await msalInstance.handleRedirectPromise(); // This will throw
msalInstance.acquireTokenSilent(); // This will also throw
✔️ A probléma megoldásához várja meg, amíg a(z) initialize befejeződik, mielőtt bármilyen más MSAL API-t meghívna:
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
Msal által nem jelzett hibák, például kiszolgálóhibák
A (z) [url] címen való lekéréshez való hozzáférést a CORS-szabályzat letiltotta
Ez a hiba MSAL.js v2.x esetén fordul elő, és az Azure Portal alkalmazásregisztrációjának helytelen konfigurációja miatt következik be. Különösen ügyeljen arra, hogy a(z) redirectUri típusa Single-page application legyen az alkalmazásregisztráció Hitelesítés paneljén. Ha sikeresen befejeződött, megjelenik egy zöld pipa, amely a következőt jelzi:
Az átirányítási URI jogosult a PKCE engedélyezési kódfolyamatára.