我按照 angular-oauth2-oidc 库的创建者的建议设法让它工作。
首先,我创建了一个 OAuthErrorEventParams 接口,我可以将 OAuthErrorEvent.params 转换为:
export interface OAuthErrorEventParams {
error: string;
error_description: string;
state: string;
}
然后我创建了这个常量来表示我的 RedirectUrl 以重定向到密码重置流程:
export const PasswordResetUrl = 'https://[tenantname].b2clogin.com/[tenantname].onmicrosoft.com/oauth2/v2.0/authorize?' +
'p=[PasswordResetFlowName]' +
'&client_id=' + authConfig.clientId +
'&nonce=defaultNonce' +
'&redirect_uri=' + window.location.origin + '/index.html' +
'&scope=openid' +
'&response_type=id_token' +
'&prompt=login';
最后,在我处理 Auth 服务的设置和配置的组件中,我添加了以下内容:
constructor(private oauthService: OAuthService) {
this.configure();
this.oauthService.events.subscribe(e => {
if (e instanceof OAuthErrorEvent) {
const parm = e.params as OAuthErrorEventParams;
if (parm.error === 'access_denied' && parm.error_description.includes('AADB2C90118')) {
// redirect to forgot password flow
window.location.href = PasswordResetUrl;
} else if (parm.error === 'access_denied' && parm.error_description.includes('AADB2C90091')) {
// user has cancelled out of password reset
this.oauthService.initLoginFlow();
}
}
});
this.oauthService.tryLoginImplicitFlow();
}
我真的希望这对某人有所帮助,因为在登陆之前我花了很长时间找到解决方案。