Вопрос или проблема
Я ищу способ настроить 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.
Вот шаги, которые вам необходимо предпринять:
- Настройка 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
],
],
])
- Реализация логики в клиентском коде: вам необходимо реализовать логику аутентификации отдельно для каждого метода в вашем клиентском коде. Например:
// Функция для анонимной покупки
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}`
}
});
// Обработка ответа
}
- Аутентификация перед защищенными действиями: перед выполнением аутентифицированного 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 запросами, вы можете контролировать уровень доступа через индивидуальные функции в зависимости от метода и состояния аутентификации пользователя.