我正在使用这个 npm 包通过 PKCE 代码流实现自动登录概念。我尽可能地遵循文档和示例。在我的 app.component.ts 构造函数中,我有以下内容:
if (this._oidcSecurityService.moduleSetup) {
this.doCallbackLogicIfRequired();
} else {
this._oidcSecurityService.onModuleSetup.subscribe(() => {
this.doCallbackLogicIfRequired();
});
}
在我的 ngOnInit 中,我有以下内容:
ngOnInit(): void {
this._oidcSecurityService.getIsAuthorized().subscribe(auth => {
this.isAuthenticated = auth;
if (!this.isAuthenticated)
this._router.navigate(['/autologin']);
});
}
在doCallbackLogicIfRequired()
我的方法中:
private doCallbackLogicIfRequired(): void {
this._oidcSecurityService.authorizedCallbackWithCode(window.location.toString());
}
由于登录页面(和按钮)位于身份服务器(STS 服务器)上,因此我的 Angular 应用程序中有一个自动登录组件,如下所示:
constructor(private _oidcSecurityService: OidcSecurityService) {
this.isAuthorizedSubscription = this._oidcSecurityService.onModuleSetup.subscribe(() => { this.onModuleSetup(); });
}
ngOnInit() {
if (this._oidcSecurityService.moduleSetup) {
this.onModuleSetup();
}
}
ngOnDestroy(): void {
this.isAuthorizedSubscription.unsubscribe();
}
private onModuleSetup() {
this._oidcSecurityService.authorize();
}
所以我的理解和基于调试流程发生如下:
- 用户从 STS 服务器登录并被重定向到 Angular 应用程序并立即进入应用程序组件
- 它在应用程序组件中做的第一件事是调用
doCallbackLogicIfRequiredMethod()
,然后调用authorizedCallbackWithCode()
方法。 - 然后它转到(应用程序组件的)ngOnInit,它检查用户是否被授权,并且由于我们是第一次登录,他/她不是,所以它路由到自动登录组件,该组件调用
oidcSecurityService.authorize()
方法。
所以,现在这是我遇到一些问题的地方,不确定发生了什么。
- 因此,在调用该
oidcSecurityService.authorize()
方法(int the auto-login.component)后,它立即进入getIsAuthorized()
位于应用程序组件 ngOnInit 中的方法的订阅主体。为什么要这样做?是什么导致它getIsAuthorized()
再次击中?
以下是问题:
- 该
getIsAuthorized()
方法被多次命中,并且由于某种原因,它总是错误的,即使在authorize()
从自动登录组件调用该方法之后也是如此。 - 当我打开静音更新时,它似乎使事情变得更糟,并且调用的
getIsAuthorized()
次数更多。
发生这种情况后,身份服务器出现了所有奇怪的问题/错误,我认为这是因为这种getIsAuthorized()
方法,也许是我对实际使用它的地点和时间的理解。
问题:
- 为了通过自动登录实现此流程,我是否根据我的示例代码采取了正确的方法?
- 有人可以解释何时
getIsAuthorized()
应该调用订阅吗?库中的其他方法是否可能在幕后调用它,这就是为什么它被我多次调用的原因? - 我似乎遇到了间歇性错误 -无效的随机数和无效的状态,为什么会发生这种情况(我读到当
authorize()
方法被多次调用时可能会发生这种情况,但我在 auto-login.component 中只有一次调用它)? - 只是为了我的理智,所以我可以更好地理解流程,
authorizedCallbackWithCode()
它去哪里的方法的目的是什么,它是否返回到任何地方(是否有我应该订阅的事件处理程序)? - 静默更新逻辑也应该调用该
authorize()
方法吗?似乎在幕后某处这样做 - 我注意到在我调用authorize()
方法之前(从自动登录组件),authorizationResultComplete
事件处理程序被触发,而我从来没有调用authorize()
. 这是静默更新的预期行为吗,如果这样做会破坏我的应用程序,我认为它应该在幕后(静默)做所有事情吗?
我一直在努力解决这个问题,如果有人使用 angular 2+ 和这个库成功地实现了这个流程,任何帮助都将不胜感激。
谢谢你!