使用 angular-auth-oidc-client 使用 PKCE 代码流自动登录

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)

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

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

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

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

以下是问题:

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

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

问题:

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

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

谢谢你!

Gi1*_*er7 3

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