使用angular-auth-oidc-client

时间:2019-07-14 02:40:17

标签: angular oauth oauth-2.0 identityserver4 pkce

我正在使用this npm package通过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服务器)上,因此我的角度应用程序中具有一个自动登录组件,如下所示:

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 auto-login.component),它将直接进入 位于应用程序组件ngOnInit中的getIsAuthorized()方法的订阅主体。为什么 这样做吗?是什么导致它再次击中getIsAuthorized()

这里是问题:

  1. getIsAuthorized()方法被多次击中,由于某种原因,它总是错误的, 即使在从自动登录组件调用authorize()方法之后。
  2. 打开无声更新后,情况似乎变得更糟,并称 getIsAuthorized()甚至更多次。

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

问题:

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

我一直在为这个问题而苦苦挣扎,如果有人成功使用此库使用angular 2+成功实现了此流程,将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您比大多数身份验证服务器目前所支持的领先。我建议您实现一个简单的示例,该示例与oidc pkce流100%兼容:authorization code flow + PKCE;我试图实现与上述相同的模式;但是该逻辑是为隐式流而设计的,似乎与从身份验证服务器收到的响应不兼容。