Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
BrowserConfigurationAuthErrors
tiruan_aplikasi_klien_publik_dipanggil
Pesan Kesalahan: Instans stub dari Aplikasi Klien Publik dipanggil. Jika menggunakan msal-react, pastikan konteks tidak digunakan tanpa penyedia.
Lihat error msal-react
BrowserAuthErrors
Interaksi sedang berlangsung
Pesan Kesalahan: Interaksi saat ini sedang berlangsung. Pastikan interaksi ini telah selesai sebelum memanggil API interaktif.
Kesalahan ini dilemparkan ketika API interaktif (loginPopup, loginRedirect, acquireTokenPopup, acquireTokenRedirect) dipanggil saat API interaktif lain masih berlangsung. API login dan acquireToken bersifat asinkron, jadi Anda perlu memastikan bahwa promise yang dihasilkan sudah resolve sebelum memanggil API lainnya.
Menggunakan loginPopup atau acquireTokenPopup
Pastikan bahwa janji yang dikembalikan dari API ini telah diselesaikan sebelum memanggil yang lain.
❌ Contoh berikut akan melemparkan kesalahan ini karena loginPopup masih akan berlangsung ketika acquireTokenPopup dipanggil:
const request = { scopes: ["openid", "profile"] };
loginPopup();
acquireTokenPopup(request);
✔️ Untuk mengatasinya, Anda harus memastikan semua API interaktif telah diselesaikan sebelum memanggil API lain:
const request = { scopes: ["openid", "profile"] };
await msalInstance.loginPopup();
await msalInstance.acquireTokenPopup(request);
Menggunakan loginRedirect atau acquireTokenRedirect
Saat menggunakan API pengalihan, handleRedirectPromise harus dipanggil saat kembali dari pengalihan. Ini memastikan bahwa respons token dari server ditangani dengan benar dan entri cache sementara dibersihkan. Kesalahan ini dilemparkan ketika handleRedirectPromise belum memiliki kesempatan untuk menyelesaikan sebelum aplikasi memanggil loginRedirect atau acquireTokenRedirect.
❌ Contoh berikut akan melemparkan kesalahan ini karena handleRedirectPromise masih akan memproses respons dari panggilan sebelumnya loginRedirect ketika loginRedirect disebut kali ke-2:
msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
✔️ Untuk mengatasi masalah ini, Anda harus menunggu hingga handleRedirectPromise selesai sebelum memanggil API interaktif apa pun:
await msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
Atau sebagai alternatif:
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);
});
Catatan: Jika Anda memanggil loginRedirect atau acquireTokenRedirect dari halaman yang bukan redirectUri Anda, Anda harus memastikan handleRedirectPromise dipanggil dan ditunggu hingga selesai baik pada halaman redirectUri maupun pada halaman tempat Anda memulai pengalihan. Ini karena redirectUri halaman akan memulai pengalihan kembali ke halaman yang awalnya dipanggil loginRedirect dan halaman tersebut akan memproses respons token.
Pustaka Pembungkus
Jika Anda menggunakan salah satu pustaka pembungkus kami (React atau Angular), silakan lihat dokumen kesalahan di pustaka tertentu tersebut karena alasan tambahan Anda mungkin menerima kesalahan ini:
Jika Anda tidak menggunakan salah satu pustaka pembungkus tetapi khawatir bahwa aplikasi Anda mungkin memicu permintaan interaktif bersamaan, Anda harus memeriksa apakah interaksi lain sedang berlangsung sebelum memanggil interaksi dalam metode akuisisi token Anda. Anda dapat mencapai ini dengan menerapkan status aplikasi global atau layanan siaran dll yang memancarkan status interaksi MSAL saat ini melalui MSAL Events API.
❌ Contoh berikut akan melemparkan kesalahan ini karena acquireTokenPopup di blok tangkapan tidak memeriksa apakah ada interaksi lain yang terjadi saat ini:
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);
✔️ Untuk mengatasinya, Anda harus menunggu status None interaksi sebelum memanggil API interaktif lainnya:
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());
Langkah Pemecahan Masalah
-
Aktifkan pengelogan verbose dan lacak urutan peristiwa. Verifikasi bahwa
handleRedirectPromisedipanggil dan dikembalikan sebelum apiloginatauacquireTokendipanggil.
Jika Anda tidak dapat mengetahui mengapa kesalahan ini dilemparkan, silakan buka masalah dan bersiaplah untuk membagikan informasi berikut:
- Log verbose
- Contoh cuplikan aplikasi dan/atau kode yang dapat kita gunakan untuk mereproduksi masalah
- Refresh halaman. Apakah kesalahan hilang?
- Buka aplikasi Anda di tab baru. Apakah kesalahan hilang?
Blokir muat ulang iframe
Pesan Kesalahan: Permintaan diblokir di dalam iframe karena MSAL mendeteksi respons autentikasi.
Kesalahan ini muncul saat memanggil ssoSilent atau acquireTokenSilent, dan halaman yang digunakan sebagai redirectUri Anda sedang mencoba memanggil fungsi login atau acquireToken.
Mitigasi yang kami rekomendasikan untuk hal ini adalah menyetel redirectUri Anda ke halaman kosong yang tidak menggunakan MSAL saat memanggil API secara senyap. Ini juga akan memiliki manfaat tambahan untuk meningkatkan performa karena iframe tersembunyi tidak perlu merender halaman Anda.
✔️ Anda dapat melakukan ini per permintaan, misalnya:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Ingatlah bahwa Anda perlu mendaftarkan redirectUri baru ini di App Registration Anda.
Jika Anda tidak ingin menggunakan redirectUri khusus untuk tujuan ini, sebaiknya pastikan bahwa redirectUri Anda tidak mencoba memanggil API MSAL saat dirender di dalam iframe tersembunyi yang digunakan oleh API silent.
monitor_window_timeout
Pesan Kesalahan:
- Akuisisi token dalam iframe gagal karena waktu habis.
Kesalahan ini dapat dilemparkan saat memanggil ssoSilent, , acquireTokenSilentacquireTokenPopup atau loginPopup dan ada beberapa alasan hal ini bisa terjadi. Ini adalah beberapa yang paling umum:
- Halaman yang Anda gunakan saat
redirectUrimenghapus atau memanipulasi hash - Halaman yang Anda gunakan sebagai
redirectUrisecara otomatis dialihkan ke halaman lain - Anda sedang dibatasi lajunya oleh penyedia identitas Anda
- Penyedia identitas Anda tidak mengarahkan kembali ke
redirectUriAnda.
Penting: Jika aplikasi Anda menggunakan pustaka router (misalnya React Router, Angular Router), pastikan aplikasi tidak menghapus hash atau pengalihan otomatis saat akuisisi token MSAL sedang berlangsung. Jika memungkinkan, sebaiknya halaman Anda redirectUri tidak memanggil router sama sekali.
Masalah yang disebabkan oleh halaman redirectUri
Saat Anda melakukan panggilan senyap, dalam beberapa kasus, iframe akan dibuka dan akan menavigasi ke halaman otorisasi penyedia identitas Anda. Setelah penyedia identitas memberi otorisasi kepada pengguna, ia akan mengalihkan iframe kembali ke redirectUri dengan kode otorisasi atau informasi kesalahan dalam fragmen hash. Instans MSAL yang berjalan di bingkai atau jendela yang awalnya membuat permintaan akan mengekstrak hash respons ini dan memprosesnya. Jika redirectUri Anda menghapus atau memanipulasi hash ini, atau menavigasi ke halaman lain sebelum MSAL mengekstraknya, Anda akan menerima kesalahan batas waktu ini.
✔️ Untuk mengatasi masalah ini, Anda harus memastikan bahwa halaman yang Anda gunakan sebagai redirectUri Anda tidak melakukan hal-hal berikut, setidaknya saat dimuat dalam jendela pop-up atau iframe. Kami menyarankan untuk menggunakan halaman kosong sebagai redirectUri Anda untuk alur silent dan pop-up agar memastikan tidak ada satu pun dari hal-hal tersebut yang dapat terjadi.
Anda dapat melakukan ini per permintaan, misalnya:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Ingatlah bahwa Anda perlu mendaftarkan redirectUri baru ini di App Registration Anda.
Catatan mengenai Angular dan React:
- Jika Anda menggunakan
@azure/msal-angular, halamanredirectUriAnda tidak boleh dilindungi olehMsalGuard. - Jika Anda menggunakan
@azure/msal-reacthalaman AndaredirectUritidak boleh merenderMsalAuthenticationComponentatau menggunakanuseMsalAuthenticationhook.
Masalah yang disebabkan oleh Penyedia Identitas
Throttling
Salah satu alasan paling umum kesalahan ini dapat dilemparkan adalah bahwa aplikasi Anda terjebak dalam perulangan atau membuat terlalu banyak permintaan token dalam waktu singkat. Saat hal ini terjadi, penyedia identitas dapat membatasi laju permintaan selanjutnya selama beberapa saat, sehingga Anda tidak akan dialihkan kembali ke redirectUri Anda dan pada akhirnya menyebabkan kesalahan ini.
✔️ Untuk mengatasi masalah akibat throttling, Anda memiliki 2 pilihan:
- Berhenti membuat permintaan untuk waktu yang singkat sebelum mencoba lagi.
- Panggil API interaktif, seperti
acquireTokenPopupatauacquireTokenRedirect.
X-Frame-Options Tolak
Anda juga bisa mendapatkan kesalahan ini jika Penyedia Identitas gagal mengalihkan kembali ke aplikasi Anda. Dalam skenario tanpa interaksi, kesalahan ini terkadang disertai dengan kesalahan X-Frame-Options: Deny, yang menunjukkan bahwa penyedia identitas Anda sedang mencoba menampilkan pesan kesalahan atau mengharuskan adanya interaksi.
✔️ Kesalahan X-Frame-Options biasanya akan memiliki url di dalamnya dan membuka url ini di tab baru dapat membantu Anda membedakan apa yang terjadi. Jika interaksi diperlukan, pertimbangkan untuk menggunakan API interaktif sebagai gantinya. Jika kesalahan sedang ditampilkan, atasi kesalahan.
Beberapa alur B2C diperkirakan akan melemparkan kesalahan ini karena kebutuhan mereka akan interaksi pengguna. Alur ini meliputi:
- Reset kata sandi
- Edit Profil
- Mendaftar
- Beberapa kebijakan kustom bergantung pada cara dikonfigurasi
Latensi Jaringan
Alasan potensial lain mengapa penyedia identitas mungkin tidak mengarahkan kembali ke aplikasi Anda tepat waktu adalah karena ada latensi jaringan tambahan.
✔️ Batas waktu default adalah sekitar 10 detik dan harus cukup dalam kebanyakan kasus, namun, jika penyedia identitas Anda membutuhkan waktu lebih lama dari itu untuk mengalihkan Anda dapat meningkatkan batas waktu ini dalam konfigurasi MSAL dengan iframeHashTimeoutparameter konfigurasi , windowHashTimeout atau 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
Pesan Kesalahan:
Nilai hash tidak dapat diproses karena kosong. Harap pastikan bahwa redirectUri Anda tidak menghapus hash.
Kesalahan ini terjadi saat halaman yang Anda gunakan sebagai redirectUri menghapus hash atau secara otomatis mengarahkan ke halaman lain. Ini paling umum terjadi ketika aplikasi mengimplementasikan router yang menavigasi ke rute lain, menghilangkan hash.
Untuk mengatasi kesalahan ini, sebaiknya gunakan halaman redirectUri khusus yang tidak tunduk pada router. Untuk panggilan diam dan popup, yang terbaik adalah menggunakan halaman kosong. Jika ini tidak memungkinkan, pastikan router tidak menavigasi saat akuisisi token MSAL sedang berlangsung. Anda dapat melakukannya dengan mendeteksi apakah aplikasi Anda dimuat di dalam iframe untuk panggilan senyap, di jendela pop-up untuk panggilan pop-up, atau dengan menunggu handleRedirectPromise untuk panggilan pengalihan.
hash tidak mengandung properti yang dikenal
Pesan Kesalahan:
Hash tidak memiliki properti yang diketahui. Pastikan bahwa redirectUri Anda tidak mengubah hash.
Silakan lihat penjelasan untuk hash_empty_error di atas. Penyebab utama kesalahan ini serupa, dengan perbedaan bahwa hash telah diubah, bukan dihapus.
tidak_dapat_memperoleh_token_dari_platform_native
Pesan Kesalahan:
- Tidak dapat memperoleh token dari platform asli.
Kesalahan ini muncul saat memanggil acquireTokenByCode API dengan nativeAccountId alih-alih code dan aplikasi berjalan di lingkungan yang tidak memperoleh token dari broker asli. Untuk daftar prasyarat, silakan tinjau dokumen pada token terikat perangkat.
Koneksi native belum terjalin
Pesan Kesalahan:
- Koneksi ke platform asli belum dibuat. Instal ekstensi browser yang kompatibel dan jalankan inisialisasi().
Kesalahan ini terjadi ketika pengguna telah masuk dengan broker native, tetapi saat ini tidak ada koneksi ke broker native tersebut. Kesalahan ini dapat terjadi karena beberapa alasan berikut:
- Ekstensi Akun Windows dihapus instalannya atau dinonaktifkan
- API
initializebelum dipanggil atau belum ditunggu penyelesaiannya sebelum memanggil API MSAL lainnya
uninitialized_public_client_application
Pesan Kesalahan:
- Anda harus memanggil dan menunggu fungsi inisialisasi sebelum mencoba memanggil API MSAL lainnya.
Kesalahan ini muncul ketika login, acquireToken atau handleRedirectPromise API dipanggil sebelum initialize API dipanggil.
initialize API harus dipanggil dan ditunggu sebelum mencoba memperoleh token.
❌ Contoh berikut akan melemparkan kesalahan ini karena handleRedirectPromise dipanggil sebelum inisialisasi selesai:
const msalInstance = new PublicClientApplication({
auth: {
clientId: "your-client-id",
},
system: {
allowNativeBroker: true,
},
});
await msalInstance.handleRedirectPromise(); // This will throw
msalInstance.acquireTokenSilent(); // This will also throw
✔️ Untuk mengatasinya, Anda harus menunggu initialize untuk menyelesaikan sebelum memanggil API MSAL lainnya:
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
Kesalahan yang tidak dilemparkan oleh msal, seperti kesalahan server
Akses untuk mengambil di [url] telah diblokir oleh kebijakan CORS
Kesalahan ini terjadi pada MSAL.js v2.x dan disebabkan oleh konfigurasi yang tidak tepat selama Pendaftaran Aplikasi pada portal Azure. Secara khusus, Anda harus memastikan redirectUri Anda terdaftar dengan tipe: Single-page application di bawah panel Autentikasi di App Registration Anda. Jika berhasil dilakukan, Anda akan melihat tanda centang hijau yang mengatakan:
URI Pengalihan Anda memenuhi syarat untuk Alur Kode Otorisasi dengan PKCE.