Я нашел всевозможные примеры использования MSAL и даже примеры использования MSAL с приложениями SPA (обычно Angular или React), но я изо всех сил пытаюсь заставить это работать с Aurelia.
Я сделал следующее, чтобы убедиться, что библиотека действительно работает должным образом.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test Page</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://secure.aadcdn.microsoftonline-p.com/lib/0.1.3/js/msal.min.js"></script>
<style>
.hidden {
visibility: hidden;
}
</style>
</head>
<body>
<div id="username"></div>
<div id="token"></div>
<button id="login" onclick="loginPopup()">Log In</button>
<button id="logout" class="hidden">Log Out</button>
<script>
var authClient = new Msal.UserAgentApplication("my v2 endpoint client id",null);
function loginPopup(){
authClient.loginPopup(["openid","user.readbasic.all"])
.then(token => {
authClient.acquireTokenSilent(["user.readbasic.all"])
.then(accessToken => {
updateUI(token);
},
error => {
authClient.acquireTokenPopup(["user.readbasic.all"])
.then(accessToken => {
updateUI(token);
},
error => {
console.log("Token Error: " + error)
})
})
},
error =>{
console.log("Login error " + error)
})
}
function updateUI(token){
var loginbutton = document.getElementById("login");
loginbutton.className = "hidden";
let usernamediv = document.getElementById("username");
let tokendiv = document.getElementById("token");
usernamediv.innerText = authClient.getUser().name;
tokendiv.innerText = token;
}
</script>
</body>
</html>
Этот код отлично работает. Вы нажимаете кнопку «Войти», появляется всплывающее окно входа в систему, вы выбираете пользователя, вводите пароль, и всплывающее окно исчезает, а пользовательский интерфейс обновляется соответствующим образом с указанием имени пользователя и токена.
Теперь я пытаюсь добавить это в свое приложение Aurelia следующим образом:
main.js
export async function configure(aurelia){
aurelia.use
.standardConfiguration()
.developmentLogging();
let msClient = new Msal.UserAgentApplication('my v2 endpoint client id",null);
aurelia.use.instance("AuthService",msClient);
await aurelia.start();
if(msClient.getUser()) {
await aurelia.setRoot(PLATFORM.moduleName("app"));
else
await aurelia.setRoot(PLATFORM.moduleName("login/login"));
login.js
export class Login {
static inject = [Aurelia, "AuthService"]
constructor(aurelia, auth){
this.authService = auth
this.app = aurelia
}
activate(){
//Also tried this code in constructor
this.authService.loginPopup(["openid","user.readbasic.all"])
.then(token => {
this.app.setRoot(PLATFORM.moduleName("app"))
});
}
}
Однако с этим кодом приложение загружается и переходит на страницу входа, которая открывает всплывающее окно входа. Однако, как только пользователь вводит / выбирает имя и пароль, всплывающий экран не исчезает. Кажется, что приложение (за всплывающим окном) перезагружается и переходит к модели просмотра app.js, но всплывающее окно остается на экране и, похоже, просит пользователя ввести / выбрать имя пользователя.
Я также пробовал использовать loginRedirect вместо loginPopup с аналогичным результатом: приложение постоянно перенаправляется на страницу входа даже после аутентификации.
Я предполагаю, что это связано с тем, как MSAL пытается реагировать на приложение, и с тем, как Аурелия пытается справиться с навигацией и т. Д., Но я не могу понять, где что-то идет не так.
Любая помощь будет принята с благодарностью!