Ошибки в MSAL Angular

BrowserAuthErrors

Interaction_in_progress

Сообщение об ошибке: взаимодействие в настоящее время выполняется. Перед вызовом интерактивного API убедитесь, что это взаимодействие завершено.

Эта ошибка возникает при вызове интерактивного API (loginPopup, loginRedirect, acquireTokenPopup, ) acquireTokenRedirectво время выполнения другого интерактивного API. Интерфейсы API для входа и полученияToken являются асинхронными, поэтому необходимо убедиться, что полученные обещания разрешены перед вызовом другого.

В @azure/msal-angular есть 2 распространенных сценария, когда это может произойти:

  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 вызывается на каждой странице, на которую может произойти перенаправление.

Если вы не можете выяснить, почему эта ошибка возникает, откройте проблему и подготовитесь к отправке следующих сведений:

  • Подробные логи
  • Пример приложения и/или фрагменты кода, которые можно использовать для воспроизведения проблемы
  • Обновите страницу. Ошибка исчезает?
  • Откройте приложение в новой вкладке. Ошибка исчезла?