JavaScript 语言 如何使用Angular HttpClient拦截器实现认证刷新

JavaScript阿木 发布于 22 天前 2 次阅读


Angular HttpClient 拦截器实现认证刷新

在Angular应用中,HttpClient是用于处理HTTP请求的模块。为了确保应用的安全性,我们通常会在请求中添加认证信息。当认证令牌过期时,我们需要刷新令牌以保持用户的会话。本文将详细介绍如何在Angular中使用HttpClient拦截器来实现认证刷新。

认证刷新是确保用户会话持续的关键功能。当令牌过期时,我们需要自动获取新的令牌,而无需用户手动重新登录。Angular HttpClient拦截器为我们提供了实现这一功能的方法。

HttpClient 拦截器简介

HttpClient拦截器是Angular提供的一种机制,允许我们在请求和响应过程中拦截和处理请求。拦截器可以添加到HttpClient实例中,并在请求发送之前或响应返回之后执行特定的逻辑。

实现认证刷新

以下是使用Angular HttpClient拦截器实现认证刷新的步骤:

1. 创建拦截器

我们需要创建一个拦截器类,该类将负责处理认证刷新的逻辑。

typescript

import { Injectable } from '@angular/core';


import {


HttpEvent,


HttpInterceptor,


HttpHandler,


HttpRequest,


HttpErrorResponse


} from '@angular/common/http';


import { Observable, throwError } from 'rxjs';


import { catchError, switchMap } from 'rxjs/operators';


import { AuthService } from './auth.service'; // 引入认证服务

@Injectable()


export class AuthInterceptor implements HttpInterceptor {


constructor(private authService: AuthService) {}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {


// 添加认证令牌到请求头


const authReq = req.clone({


setHeaders: {


Authorization: `Bearer ${this.authService.getAccessToken()}`


}


});

return next.handle(authReq).pipe(


catchError((error: HttpErrorResponse) => {


if (error.status === 401) {


// 令牌过期,尝试刷新令牌


return this.authService.refreshToken().pipe(


switchMap((newAccessToken: string) => {


// 更新认证令牌


this.authService.saveAccessToken(newAccessToken);


// 重新发送请求


return next.handle(req.clone({


setHeaders: {


Authorization: `Bearer ${newAccessToken}`


}


}));


})


);


}


return throwError(error);


})


);


}


}


2. 注册拦截器

接下来,我们需要在Angular模块中注册拦截器。

typescript

import { NgModule } from '@angular/core';


import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';


import { AuthInterceptor } from './auth-interceptor';

@NgModule({


imports: [


HttpClientModule


],


providers: [


{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }


]


})


export class AppModule {}


3. 使用认证服务

在上面的拦截器中,我们使用了`AuthService`来获取和保存认证令牌。现在,我们需要创建这个服务。

typescript

import { Injectable } from '@angular/core';


import { HttpClient } from '@angular/common/http';


import { Observable } from 'rxjs';


import { catchError } from 'rxjs/operators';

@Injectable({


providedIn: 'root'


})


export class AuthService {


private accessToken: string;

constructor(private http: HttpClient) {}

getAccessToken(): string {


return this.accessToken;


}

saveAccessToken(accessToken: string): void {


this.accessToken = accessToken;


// 可以将令牌保存到本地存储或cookie中


}

refreshToken(): Observable<string> {


// 发送刷新令牌的请求


return this.http.post('/api/refresh-token', { refreshToken: this.accessToken })


.pipe(


catchError((error: any) => {


// 处理刷新令牌失败的情况


throw error;


})


);


}


}


4. 使用HttpClient

现在,我们可以在Angular组件中使用HttpClient发送请求,而无需担心认证刷新的问题。

typescript

import { Component } from '@angular/core';


import { HttpClient } from '@angular/common/http';

@Component({


selector: 'app-example',


template: `<button (click)="getExample()">Get Example</button>`


})


export class ExampleComponent {


constructor(private http: HttpClient) {}

getExample(): void {


this.http.get('/api/example').subscribe(


(data: any) => {


console.log(data);


},


(error: any) => {


console.error(error);


}


);


}


}


总结

本文介绍了如何在Angular中使用HttpClient拦截器实现认证刷新。通过创建一个拦截器类,我们可以在请求过程中自动处理令牌过期的情况,并尝试刷新令牌。这种方法可以确保用户会话的持续,提高应用的安全性。