MSAL Angular 中的錯誤

瀏覽器認證錯誤

互動進行中

錯誤訊息:互動正在進行中。 請確保此互動已完成,然後再呼叫互動式 API。

當呼叫互動式 API(loginPopuploginRedirectacquireTokenPopupacquireTokenRedirect) 而另一個互動式 API 仍在進行中時,會跳出此錯誤。 登入與 acquireToken API 是非同步的,因此你需要確保產生的承諾已經解決,才能再呼叫下一個承諾。

@azure/msal-angular 中,這種情況常見有兩種:

  1. 你的應用程式沒有正確處理重定向。 當應用程式或使用者嘗試呼叫互動式 API 時,錯誤就會發生。
  2. 你的應用程式呼叫上述其中一個 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

如果你無法找出這個錯誤發生的原因,請 開啟一個問題 ,並準備分享以下資訊:

  • 冗長日誌
  • 一個範例應用程式和/或程式碼片段,我們可以用來重現這個問題
  • 重新整理頁面。 錯誤會消失嗎?
  • 在新分頁開啟你的申請。錯誤會消失嗎?