Конфигурация на основе глагола protectedResourceMap в MSAL

Вопрос или проблема

Я ищу способ настроить protectedResourceMap с MSAL для различения HTTP-методов. В частности, я хочу настроить открытый POST-эндпоинт и защищенный GET-эндпоинт.
Требования:

Анонимный POST: При нажатии на кнопку разрешить анонимное действие для регистрации покупки товара.
Аутентифицированный POST: Если пользователь вошел в систему, также добавить покупку в историю его аккаунта.
Аутентифицированный GET: Получение истории покупок должно быть доступно только для вошедших пользователей.
protectedResourceMap: new Map([
           // Другие записи...
          [
            'http://127.0.0.1:5000/api/cart',
            [
              'https://proficiento.onmicrosoft.com/proficiento-api/write',
              'https://proficiento.onmicrosoft.com/proficiento-api/read',
            ],
          ],

Могу ли я настроить protectedResourceMap для различения POST и GET запросов для этих эндпоинтов?
Я знаю, что могу сделать это вручную, но не хочу 🙂

Ответ или решение

Конфигурация protectedResourceMap в MSAL (Microsoft Authentication Library) позволяет управлять доступом к ресурсам, но она не учитывает различия между HTTP методами. Ваша задача заключается в том, чтобы разрешить анонимный доступ для POST-запросов на один конечный пункт и защищенный доступ для GET-запросов на другой.

К сожалению, protectedResourceMap настраивается на уровне URL и требует конфигурации для каждого метода через маппинг URL и соответствующих областей (scopes). Таким образом, вы не можете напрямую использовать разные HTTP методы в protectedResourceMap. Однако вы можете достичь желаемого поведения, комбинируя стратегию авторизации и обращения к API.

Вот шаги, которые вам необходимо предпринять:

  1. Настройка protectedResourceMap: конфигурируйте вашу карту ресурсов так, чтобы она включала только авторизованные области для защищённых GET и специфичных для ваших требований для POST. Однако, анонимный POST не следует добавлять в protectedResourceMap.
protectedResourceMap: new Map([
  [
    'http://127.0.0.1:5000/api/cart',
    [
      'https://proficiento.onmicrosoft.com/proficiento-api/write', // Для аутентифицированного POST
      'https://proficiento.onmicrosoft.com/proficiento-api/read', // Для аутентифицированного GET
    ],
  ],
])
  1. Реализация логики в клиентском коде: вам необходимо реализовать логику аутентификации отдельно для каждого метода в вашем клиентском коде. Например:
// Функция для анонимной покупки
async function buyProductAnonymously() {
  const response = await fetch('http://127.0.0.1:5000/api/cart', {
    method: 'POST',
    body: JSON.stringify({ productId: '123' }),
    headers: {
      'Content-Type': 'application/json'
    }
  });
  // Обработка ответа
}

// Функция для аутентифицированной покупки
async function buyProductAuthenticated(accessToken) {
  const response = await fetch('http://127.0.0.1:5000/api/cart', {
    method: 'POST',
    body: JSON.stringify({ productId: '123' }),
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${accessToken}`
    }
  });
  // Обработка ответа
}

// Функция для получения истории покупок
async function fetchPurchaseHistory(accessToken) {
  const response = await fetch('http://127.0.0.1:5000/api/cart/history', {
    method: 'GET',
    headers: {
      'Authorization': `Bearer ${accessToken}`
    }
  });
  // Обработка ответа
}
  1. Аутентификация перед защищенными действиями: перед выполнением аутентифицированного POST или GET запроса вам необходимо убедиться, что пользователь вошел в систему и получить accessToken через MSAL.
const msalConfig = {/* ваша конфигурация MSAL */};
const msalInstance = new msal.PublicClientApplication(msalConfig);

// Проверка аутентификации
msalInstance.loginPopup().then(response => {
  // Пользователь вошел в систему, теперь можно вызвать аутентифицированные функции
  const accessToken = response.accessToken;

  // Вызываем аутентифицированные функции, когда пользователь вошел в систему
  buyProductAuthenticated(accessToken);
  fetchPurchaseHistory(accessToken);
}).catch(error => {
  console.error(error);
});

Таким образом, хотя protectedResourceMap не позволяет вам прямо настроить различия между GET и POST запросами, вы можете контролировать уровень доступа через индивидуальные функции в зависимости от метода и состояния аутентификации пользователя.

Оцените материал
Добавить комментарий

Капча загружается...