瀏覽器認證錯誤
互動進行中
錯誤訊息:互動正在進行中。 請確保此互動已完成,然後再呼叫互動式 API。
當呼叫互動式 API(loginPopup, loginRedirect, acquireTokenPopup, acquireTokenRedirect) 而另一個互動式 API 仍在進行中時,會跳出此錯誤。 登入與 acquireToken API 是非同步的,因此你需要確保產生的承諾已經解決,才能再呼叫下一個承諾。
在 @azure/msal-angular 中,這種情況常見有兩種:
- 你的應用程式沒有正確處理重定向。 當應用程式或使用者嘗試呼叫互動式 API 時,錯誤就會發生。
- 你的應用程式呼叫上述其中一個 API,卻沒有先檢查其他地方是否已經進行互動。
重新導向必須透過 MsalRedirectComponent 或呼叫 handleRedirectObservable() 來處理。 若未用這兩種方法明確處理重定向,會導致上述錯誤。
請參考我們關於重定向的文件,了解更多兩種方法的資訊。
此外,任何互動都應在訂閱 inProgress$ 可觀察物件並篩選出 InteractionStatus.None 之後進行。 當另一個互動仍在進行時,不支援嘗試互動,否則會導致上述錯誤。 檢查 InteractionStatus.None 是確保這種情況不會發生的方法。 詳情請參閱我們的 活動文件 。
請參閱 @azure/msal-browser 錯誤文件 以獲得更多關於此錯誤的資訊。
❌ 以下範例會在其他元件已經呼叫正在進行的互動式 API 時,拋出此錯誤:
import { Component, OnInit } from '@angular/core';
import { MsalService, MsalBroadcastService, InteractionStatus } from '@azure/msal-angular';
import { filter } from 'rxjs/operators';
@Component()
export class ExampleComponent implements OnInit {
constructor(
private msalBroadcastService: MsalBroadcastService,
private authService: MsalService
) {}
ngOnInit(): void {
this.authService.loginRedirect();
}
✔️ 為了修正前述範例,請在呼叫 loginRedirect前確認沒有其他互動進行中:
import { Component, OnInit } from '@angular/core';
import { InteractionStatus } from '@azure/msal-browser';
import { MsalService, MsalBroadcastService } from '@azure/msal-angular';
import { filter } from 'rxjs/operators';
@Component()
export class ExampleComponent implements OnInit {
constructor(
private msalBroadcastService: MsalBroadcastService,
private authService: MsalService
) {}
ngOnInit(): void {
this.msalBroadcastService.inProgress$
.pipe(
filter((status: InteractionStatus) => status === InteractionStatus.None),
)
.subscribe(() => {
this.authService.loginRedirect();
})
}
疑難排解步驟
- 啟用詳細記錄,並追蹤事件發生的順序。 確認在另一個 API 解決前,沒有人會呼叫互動式 API。
- 如果使用重新導向流程,請確保
MsalRedirectComponet已正確初始化,或在每個可能被重新導向至的頁面上呼叫handleRedirectObservable。
如果你無法找出這個錯誤發生的原因,請 開啟一個問題 ,並準備分享以下資訊:
- 冗長日誌
- 一個範例應用程式和/或程式碼片段,我們可以用來重現這個問題
- 重新整理頁面。 錯誤會消失嗎?
- 在新分頁開啟你的申請。錯誤會消失嗎?