Я работаю с существующим одностраничным приложением, которое мы недавно перевели с поставщика аутентификации On-Prim на Azure Active Directory и MSAL. js Мы используем WindowsAzureActiveDirectoryBearerAuthenticationMiddleware на бэкэнде для защиты конечных точек WebAPI .
API безопасен, пользователи могут входить в систему, и все работает. Проблема начинается примерно в то время, когда токен истекает на отметке в один час. Метод tokenSilent возвращает токен с нулевым accessToken.
Я обнаружил эту проблему на Guthub.
https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/736
Короткие и грязные запросы токенов, которые относятся к приложению с одной областью действия, будут возвращает только обновленный id_token, но не обновленный accessToken. Решение состоит в том, чтобы добавить дополнительную область. Если я это сделаю, появится сообщение об ошибке: Идентификатор клиента может быть предоставлен только как одна область
Любая помощь будет отправлена
var clientApplication;
// Enter Global Config Values & Instantiate MSAL Client application
window.msalConfig = {
auth: {
clientId: 'obfuscated'
, authority: "https://login.microsoftonline.com/common"
, validateAuthority: true
, redirectUri: window.location.protocol + "//" + window.location.host + "/msal.html" //http://localhost:58541/msal.html
}
, cache: {
cacheLocation: "localStorage"
}
, graphScope: {
scopes: ["https://graph.microsoft.com/User.Read", "https://graph.microsoft.com/Mail.Send" ]
}
, appScope: {
scopes: ["obfuscated"]
}
};
axios.interceptors.request.use(async function (options) {
var scope = window.msalConfig.appScope; //based on where the request is going, will need to decide what token to get.
var tokenType = "AuthToken"; //this probably ins't needed after rewriting all existing jquery.ajax hooks
if (options.url.includes("microsoft")) {
scope = window.msalConfig.graphScope;
tokenType = "GraphToken"; //this probably ins't needed after rewriting all existing jquery.ajax hooks
}
self.Loading({ State: true, Title: "Working on it..." });
options.headers['Authorization'] = "Bearer " + await tokenSilent(tokenType, scope);
return options;
}, function (error) {
console.log('Axios Request Error: ', error);
return promise.reject(error);
});
async function tokenSilent(tokenType, scope) {
console.log('Axios Request VERBOS: main.js.tokenSilent');
return await clientApplication.acquireTokenSilent(scope)
.then(async function (token) {
Cookies.set(tokenType, token.accessToken); // "Bearer " +
self.LoginID(token.account.userName);
return token.accessToken;
}, async function (error) {
return await tokenPopup(scope);
console.log(error);
});
};
async function tokenPopup(tokenType, scope) {
console.log('Axios Request VERBOS: main.js.tokenPopup');
return await clientApplication.acquireTokenPopup(scope)
.then(async function (token) {
Cookies.set(tokenType, token.accessToken); //"Bearer " +
self.LoginID(token.account.userName);
return token.accessToken;
}, async function (error) {
return await loginPopup(scope);
console.log(error);
});
};
async function loginPopup(tokenType, scope) {
console.log('Axios Request VERBOS: main.js.loginPopup');
window.location.hash = "/auth";
};
Есть ли способ продлить жизненный цикл токена моего корпоративного приложения, или мой код неправильный и он не получает обновленный токен?