3

oidc-client-js で angular 8 を使用しています。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、コード フローで必要なサーバーのものを送信します) - サーバーは、ユーザーがログインしているかどうかを確認します。ログインしていない場合は、ログイン ページにリダイレクトします。問題は、(signinRedirect) を呼び出すボタンをクリックするとシナリオが機能するが、コンポーネントが開いているときにそれを実行すると機能しないことです。ループはログで終了します - ログインの表示: ユーザーは認証されていません。ループは HTTP/1.1 GET http://localhost:5555/.well-known/openid-configurationを開始するリクエストで始まります。その後 - HTTP/1.1 GET を開始するリクエストhttp://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