第一个拦截器将jwt添加到请求头中。
export const jwtInterceptor: HttpInterceptorFn = (req, next) => {
const authService = inject(AuthService);
const router = inject(Router);
let authToken = localStorage.getItem("accessToken");
const apiUrl = req.url.startsWith("https://localhost:7096/api");
if(authToken && apiUrl){
req = req.clone({
setHeaders:{
Authorization: `Bearer ${authToken}`
}
});
}
return next(req);
};
第二个拦截器处理全局错误。
export const errorHandlerInterceptor: HttpInterceptorFn = (req, next) => {
const alertifyService = inject(AlertifyService);
const router:Router = inject(Router);
const authService = inject(AuthService);
return next(req).pipe(catchError((err) => {
debugger;
if(err){
switch(err.status){
case 401:{
if(localStorage.getItem('accessToken') && localStorage.getItem('refreshToken')){
debugger;
authService.refreshAccesToken((state) =>{
if(state){
console.log(localStorage.getItem('accessToken'));
}else{
authService.logOut();
}
})
}else{
alertifyService.message("Yetkisiz erişim!!", {
messageType:MessageType.Error,
position:SetPosition.TopRight
})
router.navigate(["/"]);
}
break;
}
}
}
return of(err);
}));
};
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(
private httpClient:HttpClientService,
private jwtHelper:JwtHelperService,
private router:Router) {
}
async refreshAccesToken(callbackFunc?:(state) => void){
const refreshToken = localStorage.getItem('refreshToken');
const response:Observable<any>= this.httpClient.post({
controller:"auth",
action:"LoginRefreshToken",
}, {refreshToken: refreshToken});
debugger;
try{
const tokens:TokenResponse = await firstValueFrom(response) as TokenResponse;
if(tokens){
localStorage.setItem('accessToken', tokens.accessToken);
localStorage.setItem('refreshToken', tokens.refreshToken);
}
callbackFunc(tokens ? true: false);
}catch{
callbackFunc(false);
}
}
addJwtBearer(req:HttpRequest<unknown>){
debugger;
let authToken = localStorage.getItem("accessToken");
const apiUrl = req.url.startsWith("https://localhost:7096/api");
if(authToken && apiUrl){
req = req.clone({
setHeaders:{
Authorization: `Bearer ${authToken}`
}
});
}
return req;
}
logOut(){
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
this.router.navigate(["/"]);
}
}
问题是,在发送重复令牌的请求后,我无法在没有收到未经授权的错误的情况下处理先前的请求。我必须再次刷新页面。这是一个不合逻辑的解决方案。
虽然PDX Elite Town Car专注于豪华婚礼当天交通,但我们了解平稳流程在生活各个方面(包括技术)的重要性。如果您在 Angular 中使用刷新令牌请求新令牌时遇到问题,可能是由于拦截器配置错误、令牌过期或缺少标头造成的。正如我们确保您婚礼当天运输的完美物流一样,请务必调试请求流程以提高效率。
要在您的特殊日子享受无缝、无压力的交通,请访问 PDX Elite Town Car。