我有一个需要在 Azure 中进行身份验证的 Ionic 应用程序,因此我按照本教程安装了 MSAL: https ://docs.microsoft.com/en-us/graph/tutorials/angular
它就像“离子服务”的魅力,但是当我在设备中运行它时,当我尝试登录 Azure 时它会崩溃。我认为这是因为在 Ionic 中不允许弹出窗口 MSAL 显示用于登录。
所以我的第一次尝试是将 loginPopup() 调用更改为 loginRedirect()。所以我删除了这段代码:
async signIn(): Promise<void> {
const result = await this.msalService
.loginPopup(OAuthSettings)
.toPromise()
.catch((reason) => {
this.alertsService.addError('Login failed',
JSON.stringify(reason, null, 2));
});
if (result) {
this.msalService.instance.setActiveAccount(result.account);
this.authenticated = true;
this.user = await this.getUser();
}
}
我添加了这个新的(基于https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/errors.md):
async signIn(): Promise<void> {
await this.msalService.instance.handleRedirectPromise();
const accounts = this.msalService.instance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
this.msalService.instance.loginRedirect();
}
}
但是这种方式,用户信息没有保存,因为我没有“结果”来处理或调用 setActiveAccount(result)。它甚至在“离子服务”中也不起作用,所以我放弃了这种方法。
第二种方法,在寻找可能的解决方案两天后,是在 InAppBrowser (https://ionicframework.com/docs/native/in-app-browser)中显示弹出窗口,所以我将代码更改为:
async signIn(): Promise<void> {
const browser = this.iab.create('https://www.microsoft.com/');
browser.executeScript({ code: "\
const result = await this.msalService\
.loginPopup(OAuthSettings)\
.toPromise()\
.catch((reason) => {\
this.alertsService.addError('Login failed',\
JSON.stringify(reason, null, 2));\
});\
if (result) {\
this.msalService.instance.setActiveAccount(result.account);\
this.authenticated = true;\
this.user = await this.getUser();\
}"
});
}
但它只是打开一个新窗口,什么都不做,它不执行loginPopup(),所以我也放弃了第二种方法。
任何人都知道如何避免 Ionic 中的弹出问题?
谢谢