You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular集成Keycloak:刷新令牌过期时自动跳转登录页方案咨询

解决Angular Keycloak令牌双过期后自动重定向登录的问题

可以通过HTTP拦截器捕获API调用返回的invalid_grant错误,触发Keycloak的登录重定向逻辑,具体步骤如下:

1. 创建HTTP拦截器捕获错误

在Angular项目中生成一个拦截器,用来监听所有HTTP请求的响应错误:

import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor,
  HttpErrorResponse
} from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { KeycloakService } from 'keycloak-angular';

@Injectable()
export class KeycloakTokenInterceptor implements HttpInterceptor {

  constructor(private keycloakService: KeycloakService) {}

  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    return next.handle(request).pipe(
      catchError((error: HttpErrorResponse) => {
        // 匹配Keycloak返回的令牌无效错误
        if (error.error?.error === 'invalid_grant' && error.error?.error_description === 'Token is not active') {
          // 登出后跳转登录页
          this.keycloakService.logout().then(() => {
            this.keycloakService.login();
          });
        }
        return throwError(() => error);
      })
    );
  }
}

2. 注册拦截器到Angular模块

在app.module.ts中将拦截器添加到HTTP拦截器提供商列表:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { KeycloakTokenInterceptor } from './keycloak-token.interceptor';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: KeycloakTokenInterceptor,
      multi: true
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

3. 额外优化:主动监听令牌过期事件

除了拦截API错误,还可以直接监听Keycloak的令牌过期回调,提前处理过期场景:
在app.component.ts的ngOnInit中添加监听逻辑:

import { KeycloakService } from 'keycloak-angular';

constructor(private keycloakService: KeycloakService) {}

ngOnInit(): void {
  // 监听Keycloak令牌过期事件
  this.keycloakService.keycloakEvents$.subscribe(event => {
    if (event.type === 'onTokenExpired') {
      // 尝试刷新令牌,失败则跳转登录
      this.keycloakService.updateToken(5).then(refreshed => {
        if (!refreshed) {
          this.keycloakService.logout().then(() => this.keycloakService.login());
        }
      }).catch(() => {
        this.keycloakService.logout().then(() => this.keycloakService.login());
      });
    }
  });
}

这样不管是API调用返回令牌无效错误,还是令牌主动过期,都能自动触发登录重定向,解决无后续操作的问题。

内容的提问来源于stack exchange,提问作者Aleksa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:48:24