我将 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 . 然后它重复。