3

我将 Angular 8 与 oidc-client-js 一起使用。我已连接到 IdentityServer4(代码流 + PKCE)。打开应用程序(在主组件内部)后,我想检查用户是否已通过身份验证。这就是我调用signinRedirect() 的原因。我没有手动单击按钮,而是在构造函数中调用它(当我只是单击按钮调用 signinRedirect() 时,整个流程工作)。问题是我被困在无限循环中。Angular 不断调用 IdenityServer 并刷新登录页面。对服务器的 api 调用(并因此重定向到登录页面)工作正常,但不会停止。请帮忙。

export class AuthService {
  private userManager: UserManager;
  private user: User;

  constructor(private client: HttpClient) {
    this.userManager = new UserManager(AuthSettings.settings);
    this.userManager.getUser().then(user => {
      this.user = user;
    });
  }

  checkCredentials() {
    if (!this.isUserLoggedIn()) {
      this.redirectToLogin();
    }
  }

  redirectToLogin() {
    return this.userManager.signinRedirect();
  }

  isUserLoggedIn(): boolean {
    return this.user != null && !this.user.expired;
  }
}
export class AppComponent {
  title = "app";

  constructor(private authService: AuthService) {
    this.authService.checkCredentials();
  }
}

用户输入 Angular 应用程序。然后我调用授权端点(signinRedirect,发送代码流中所需的服务器内容) - 如果用户登录,服务器会检查 cookie。如果没有,它会将我重定向到登录页面。问题是,如果我单击一个调用 (signinRedirect) 的按钮,但当我在打开组件时执行它时,该场景将起作用。循环以日志结束 - 显示登录:用户未通过身份验证。循环以 Request started HTTP/1.1 GET http://localhost:5555/.well-known/openid-configuration开始。然后 - 请求开始 HTTP/1.1 GEThttp://localhost:5555/connect/authorize?response_type=code&client_id=ng&state=kYkvO3CO4SW3asopth-dmZW8SYkuyz79Npfn0K4MPAMCT&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fcallback&scope=openid%20API&code_challenge=2iGwqANCfZGshjmhDmmwm4Eh4Q8SowgPcImf1-CsDzs&code_challenge_method=S256&nonce=kYkvO3CO4SW3asopth-dmZW8SYkuyz79Npfn0K4MPAMCT . 然后它重复。

4

1 回答 1

2

也许我迟到了。以下是我的观察。

您的身份验证服务构造函数中的以下代码异步工作,这是一个很好的理由,您不会让时间检查凭据填充用户对象,称为应用内组件,还可以通过使构造函数成为反模式来解决此问题,您真的需要在此处使用 async 和 await 。

 this.userManager.getUser().then(user => {
      this.user = user;
    });
于 2019-09-09T21:36:28.730 回答