让授权拦截器不拦截对凭据端点的请求

时间:2018-08-22 15:20:31

标签: angular

我有一个拦截器,该拦截器将JWT访问令牌添加到针对资源服务器的请求中:

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  constructor(private keycloakClientService: KeycloakClientService) { }

  intercept(request: HttpRequest<any>, next: HttpHandler) {
    return this.addAuthHeader(request, next);
  }

  private addAuthHeader(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log('=======>> Intercepting the http request to add the jwt token in the header');
  }
}

我还有一个登录表单,用于将请求发送到凭据端点到授权服务器:

  login(): void {
    this.userRestService.login(this.username, this.password).subscribe(
      data => {
        this.authService.setJwtTokenToLocalStorage(data.token);
        this.router.navigate(['user']);
      }
    );
  }

  public login(ussername: string, password: string): Observable<any> {
    console.log('Sending the login credentials to obtain a token');
    const credentials = { username: ussername, password: password };
    const url: string = environment.USER_REST_URL + '/login';
    return this.httpClient.post(url, credentials);
  }

问题在于拦截器正在拦截上述对凭据端点的请求。

我希望拦截器仅拦截包含发送到资源服务器的所有端点的JWT访问令牌的请求,而不拦截发送到授权服务器的凭据端点的请求。

我应该使用一些URI模式匹配吗?

我的设计首先存在缺陷吗?

我正在使用角度6.0.4

1 个答案:

答案 0 :(得分:0)

HttpRequest具有一个url属性,您可以使用:

if (/^\/login$/.test(request.url)) {
    return next.handle(request);
}

如果您需要参数来做出决定,也可以使用urlWithParams

请注意,立即调用next.handle()会使您的拦截器成为noop,而其他拦截器将被执行,就好像您的拦截器不在那里一样。