如何在angular-auth-oidc-client中为特定API调用绕过令牌拦截器?
绕过angular-auth-oidc-client拦截器排除特定请求的方案
方法一:利用HttpContext标记跳过令牌附加
- 定义一个HttpContextToken,用来标记是否跳过令牌:
import { HttpContextToken } from '@angular/common/http'; export const SKIP_AUTH_TOKEN = new HttpContextToken<boolean>(() => false);
- 发起不需要令牌的请求时,添加该上下文标记:
this.http.get('/api/public/your-endpoint', { context: new HttpContext().set(SKIP_AUTH_TOKEN, true) });
- 自定义拦截器,在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); } }
- 在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
相关产品推荐
相关产品推荐

