Bry*_*Man 7 oauth oauth-2.0 identityserver4 angular pkce
我正在使用此 npm 包通过 PKCE 代码流实现自动登录概念。我尽可能地按照文档和示例进行操作。在我的 app.component.ts 构造函数中,我有以下内容:
if (this._oidcSecurityService.moduleSetup) {
this.doCallbackLogicIfRequired();
} else {
this._oidcSecurityService.onModuleSetup.subscribe(() => {
this.doCallbackLogicIfRequired();
});
}
Run Code Online (Sandbox Code Playgroud)
在我的 ngOnInit 我有以下内容:
ngOnInit(): void {
this._oidcSecurityService.getIsAuthorized().subscribe(auth => {
this.isAuthenticated = auth;
if (!this.isAuthenticated)
this._router.navigate(['/autologin']);
});
}
Run Code Online (Sandbox Code Playgroud)
在doCallbackLogicIfRequired()我的方法中:
private doCallbackLogicIfRequired(): void {
this._oidcSecurityService.authorizedCallbackWithCode(window.location.toString());
}
Run Code Online (Sandbox Code Playgroud)
由于登录页面(和按钮)位于身份服务器(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();
}
Run Code Online (Sandbox Code Playgroud)
所以我的理解和基于调试的流程如下:
doCallbackLogicIfRequiredMethod(),然后调用authorizedCallbackWithCode()方法。oidcSecurityService.authorize()方法。所以,现在这是我遇到一些问题的地方,我不确定发生了什么。
oidcSecurityService.authorize()
方法(在 auto-login.component 中)后,它立即进入getIsAuthorized()位于应用程序组件 ngOnInit中的方法的订阅主体。为什么要这样做?是什么导致它getIsAuthorized()再次击中?以下是问题:
getIsAuthorized()方法被多次命中,并且由于某种原因,它始终为 false,即使在authorize()从自动登录组件调用该方法之后也是如此。getIsAuthorized()更多次。发生这种情况后,我遇到了身份服务器的所有奇怪问题/错误,我认为这是因为这种getIsAuthorized()方法,也许是我对实际使用它的地点和时间的理解。
问题:
getIsAuthorized()应该调用订阅吗?库中的其他方法是否可能在幕后调用它,这就是为什么它被我多次调用?authorize()多次调用该方法时可能会发生这种情况,但我在 auto-login.component 中只有一次调用它)?authorizedCallbackWithCode()方法的目的是什么
,它去哪里,它是否返回到任何地方(是否有我应该订阅的事件处理程序)?authorize()方法?它似乎在幕后的某个地方这样做 - 我注意到在我调用该authorize()方法之前(从自动登录组件),
authorizationResultComplete事件处理程序被触发,而我从未调用authorize(). 这是静默更新的预期行为吗,它是否应该通过这样做来破坏我的应用程序,我认为它应该在幕后(静默地)做所有事情?我一直在努力解决这个问题,如果有人使用 angular 2+ 和这个库成功地实现了这个流程,任何帮助将不胜感激。
谢谢你!
我认为您远远领先于大多数身份验证服务器当前支持的功能。我建议您实现与 oidc pkce 流程 100% 兼容的简单示例:授权码流程 + PKCE;我尝试实现您上面描述的相同模式;但该逻辑是为隐式流程设计的,似乎与从身份验证服务器收到的响应不兼容。
| 归档时间: |
|
| 查看次数: |
3319 次 |
| 最近记录: |