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

如何在angular-auth-oidc-client中为特定API调用绕过令牌拦截器?

绕过angular-auth-oidc-client拦截器排除特定请求的方案

方法一:利用HttpContext标记跳过令牌附加

  1. 定义一个HttpContextToken,用来标记是否跳过令牌:
import { HttpContextToken } from '@angular/common/http';

export const SKIP_AUTH_TOKEN = new HttpContextToken<boolean>(() => false);
  1. 发起不需要令牌的请求时,添加该上下文标记:
this.http.get('/api/public/your-endpoint', {
  context: new HttpContext().set(SKIP_AUTH_TOKEN, true)
});
  1. 自定义拦截器,在OidcInterceptor之后运行,检查标记并移除Authorization头:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { SKIP_AUTH_TOKEN } from './path-to-your-token';

@Injectable()
export class SkipAuthInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (req.context.get(SKIP_AUTH_TOKEN)) {
      req = req.clone({ headers: req.headers.delete('Authorization') });
    }
    return next.handle(req);
  }
}
  1. 在AppModule的providers中注册这个拦截器,注意顺序要在OidcInterceptor之后:
providers: [
  { provide: HTTP_INTERCEPTORS, useClass: SkipAuthInterceptor, multi: true }
]

方法二:配置OidcInterceptor的路由过滤规则

直接在AuthModule的初始化配置中,指定不需要附加令牌的路由:

import { AuthModule } from 'angular-auth-oidc-client';

@NgModule({
  imports: [
    AuthModule.forRoot({
      config: {
        // 你的OIDC基础配置(授权地址、客户端ID等)
        authority: 'https://your-oidc-provider.com',
        clientId: 'your-client-id',
        redirectUrl: window.location.origin,
        postLogoutRedirectUri: window.location.origin,
        scope: 'openid profile email',
        responseType: 'code',
        // 配置拦截器规则
        interceptor: {
          // 只给指定路径添加令牌(可选,和disallowedRoutes二选一或配合使用)
          allowedList: ['/api/secure/**'],
          // 排除不需要令牌的路径
          disallowedRoutes: ['/api/public/your-endpoint']
        }
      }
    })
  ]
})
export class AppModule { }

这种方式更直接,不需要额外写拦截器,适合批量排除固定路径的请求。

方法三:手动克隆请求并清空Authorization头

如果只是个别请求临时跳过,可以在发起请求时手动克隆请求,移除Authorization头:

const clonedReq = req.clone({ headers: req.headers.delete('Authorization') });
this.http.request(clonedReq);

不过这种方式可能被OidcInterceptor覆盖,不如前两种方法稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:07:04