7

我正在使用这个 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();
  }

所以我的理解和基于调试流程发生如下:

  1. 用户从 STS 服务器登录并被重定向到 Angular 应用程序并立即进入应用程序组件
  2. 它在应用程序组件中做的第一件事是调用doCallbackLogicIfRequiredMethod(),然后调用authorizedCallbackWithCode()方法。
  3. 然后它转到(应用程序组件的)ngOnInit,它检查用户是否被授权,并且由于我们是第一次登录,他/她不是,所以它路由到自动登录组件,该组件调用oidcSecurityService.authorize()方法。

所以,现在这是我遇到一些问题的地方,不确定发生了什么。

  1. 因此,在调用该oidcSecurityService.authorize() 方法(int the auto-login.component)后,它立即进入getIsAuthorized()位于应用程序组件 ngOnInit 中的方法的订阅主体。为什么要这样做?是什么导致它getIsAuthorized()再次击中?

以下是问题:

  1. getIsAuthorized()方法被多次命中,并且由于某种原因,它总是错误的,即使在authorize()从自动登录组件调用该方法之后也是如此。
  2. 当我打开静音更新时,它似乎使事情变得更糟,并且调用的 getIsAuthorized()次数更多。

发生这种情况后,身份服务器出现了所有奇怪的问题/错误,我认为这是因为这种getIsAuthorized()方法,也许是我对实际使用它的地点和时间的理解。

问题:

  1. 为了通过自动登录实现此流程,我是否根据我的示例代码采取了正确的方法?
  2. 有人可以解释何时getIsAuthorized()应该调用订阅吗?库中的其他方法是否可能在幕后调用它,这就是为什么它被我多次调用的原因?
  3. 我似乎遇到了间歇性错误 -无效的随机数无效的状态,为什么会发生这种情况(我读到当authorize()方法被多次调用时可能会发生这种情况,但我在 auto-login.component 中只有一次调用它)?
  4. 只是为了我的理智,所以我可以更好地理解流程, authorizedCallbackWithCode()它去哪里的方法的目的是什么,它是否返回到任何地方(是否有我应该订阅的事件处理程序)?
  5. 静默更新逻辑也应该调用该authorize()方法吗?似乎在幕后某处这样做 - 我注意到在我调用authorize()方法之前(从自动登录组件), authorizationResultComplete事件处理程序被触发,而我从来没有调用authorize(). 这是静默更新的预期行为吗,如果这样做会破坏我的应用程序,我认为它应该在幕后(静默)做所有事情吗?

我一直在努力解决这个问题,如果有人使用 angular 2+ 和这个库成功地实现了这个流程,任何帮助都将不胜感激。

谢谢你!

4

1 回答 1

3

我认为您比大多数身份验证服务器当前支持的方式领先得多。我建议你实现一个100%兼容oidc pkce流程的简单例子:授权码流程+PKCE;我尝试实现您上面描述的相同模式;但是该逻辑是为隐式流设计的,并且似乎与从身份验证服务器收到的响应不兼容。

于 2019-08-10T02:42:33.937 回答