Одностраничные приложения: вход и выход

Прежде чем можно будет получить маркеры для доступа к API в приложении, необходим контекст пользователя, прошедшего проверку подлинности. Для проверки подлинности пользователя можно использовать всплывающее окно и (или) метод входа в перенаправление.

Если у приложения есть доступ к прошедшему проверку контекста пользователя или маркера идентификатора, можно пропустить шаг входа и напрямую получить маркеры. Дополнительные сведения см. в статье "Единый вход" с указанием пользователя.

Выбор между всплывающим окном и перенаправлением

Выбор всплывающего окна или перенаправления зависит от потока приложения.

  • Используйте всплывающее окно, если вы не хотите, чтобы пользователи отойти от главной страницы приложения во время проверки подлинности. Так как перенаправление проверки подлинности происходит во всплывающем окне, состояние основного приложения сохраняется.

  • Используйте перенаправление, если у пользователей есть ограничения браузера или политики, в которых всплывающие окна отключены. Например, существуют известные проблемы с всплывающих окон в Интернете Обозреватель.

Вход с помощью всплывающего окна

const config = {
  auth: {
    clientId: "your_app_id",
    redirectUri: "your_app_redirect_uri", //defaults to application start page
    postLogoutRedirectUri: "your_app_logout_redirect_uri",
  },
};

const loginRequest = {
  scopes: ["User.ReadWrite"],
};

let accountId = "";

const myMsal = new PublicClientApplication(config);

myMsal
  .loginPopup(loginRequest)
  .then(function (loginResponse) {
    accountId = loginResponse.account.homeAccountId;
    // Display signed-in user content, call API, etc.
  })
  .catch(function (error) {
    //login failure
    console.log(error);
  });

Вход с помощью перенаправления

const config = {
  auth: {
    clientId: "your_app_id",
    redirectUri: "your_app_redirect_uri", //defaults to application start page
    postLogoutRedirectUri: "your_app_logout_redirect_uri",
  },
};

const loginRequest = {
  scopes: ["User.ReadWrite"],
};

let accountId = "";

const myMsal = new PublicClientApplication(config);

function handleResponse(response) {
  if (response !== null) {
    accountId = response.account.homeAccountId;
    // Display signed-in user content, call API, etc.
  } else {
    // In case multiple accounts exist, you can select
    const currentAccounts = myMsal.getAllAccounts();

    if (currentAccounts.length === 0) {
      // no accounts signed-in, attempt to sign a user in
      myMsal.loginRedirect(loginRequest);
    } else if (currentAccounts.length > 1) {
      // Add choose account code here
    } else if (currentAccounts.length === 1) {
      accountId = currentAccounts[0].homeAccountId;
    }
  }
}

myMsal.handleRedirectPromise().then(handleResponse);

Поведение выхода в браузерах

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

  • На общих устройствах пользователи должны использовать частный или инкогнито-режим браузера и закрыть все окна браузера, прежде чем они отойти от устройства.

  • На устройствах, которые не являются общими, пользователи должны использовать экран блокировки операционной системы для блокировки или выхода из всего сеанса операционной системы на устройстве. Корпорация Майкрософт использует свою страницу выхода для напоминания пользователям об этих рекомендациях по конфиденциальности и безопасности.

Дополнительные сведения см . в рекомендациях майкрософт по конфиденциальности интернета.

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

  • Выход внешнего канала Подключение Microsoft OpenID для федеративного выхода. Этот параметр можно использовать, если приложение предоставляет общий доступ к состоянию входа с новым приложением, но управляет собственными токенами сеансов или файлами cookie. Существуют некоторые ограничения для этой реализации, в которой содержимое блокируется, например если браузеры блокируют сторонние файлы cookie.

  • Всплывающее окно и /или перенаправлениедля выхода локального приложения. Всплывающие и перенаправленные методы заканчивают сеанс пользователя в конечной точке и для локального приложения. Но эти методы могут не сразу очистить сеанс для других федеративных приложений, если взаимодействие с интерфейсным каналом заблокировано.

Выход из всплывающего окна

MSAL.js версии 2 и выше предоставляет logoutPopup метод, который очищает кэш в хранилище браузеров и открывает всплывающее окно на странице выхода Microsoft Entra. После выхода перенаправление по умолчанию выполняется на начальную страницу входа, а всплывающее окно закрывается.

После выхода можно настроить postLogoutRedirectUri перенаправление пользователя в определенный универсальный код ресурса (URI). Указанный URI должен быть зарегистрирован как URI перенаправления при регистрации вашего приложения. Вы также можете настроить logoutPopup перенаправление главного окна на другую страницу, например домашнюю страницу или страницу входа, передав mainWindowRedirectUri в рамках запроса.

const config = {
  auth: {
    clientId: "your_app_id",
    redirectUri: "your_app_redirect_uri", // defaults to application start page
    postLogoutRedirectUri: "your_app_logout_redirect_uri",
  },
};

const myMsal = new PublicClientApplication(config);

// you can select which account application should sign out
const logoutRequest = {
  account: myMsal.getAccountByHomeId(homeAccountId),
  mainWindowRedirectUri: "your_app_main_window_redirect_uri",
};

await myMsal.logoutPopup(logoutRequest);

Выход с перенаправлением

MSAL.js предоставляет logout метод версии 1 и logoutRedirect метод версии 2, который очищает кэш в хранилище браузеров и перенаправляется на страницу выхода Microsoft Entra. После выхода перенаправление по умолчанию перейдет на начальную страницу входа.

После выхода можно настроить postLogoutRedirectUri перенаправление пользователя в определенный универсальный код ресурса (URI). Указанный URI должен быть зарегистрирован как URI перенаправления при регистрации вашего приложения.

Так как напоминание Майкрософт о рекомендациях по конфиденциальности Интернета о использовании частного браузера и экрана блокировки не отображается в этом методе, вам может потребоваться описать рекомендации и напомнить пользователям о закрытии всех окон браузера.

const config = {
  auth: {
    clientId: "your_app_id",
    redirectUri: "your_app_redirect_uri", //defaults to application start page
    postLogoutRedirectUri: "your_app_logout_redirect_uri",
  },
};

const myMsal = new PublicClientApplication(config);

// you can select which account application should sign out
const logoutRequest = {
  account: myMsal.getAccountByHomeId(homeAccountId),
};

myMsal.logoutRedirect(logoutRequest);

Следующие шаги

Перейдите к следующей статье в этом сценарии, Получение токена для приложения.