Angular 截击机
您好我在Angular 9中实现了一个拦截器,当捕获idtoken不正确时,它会生成新的令牌,但不会再次发送请求,拦截器代码如下:Angular 截击机,angular,typescript,Angular,Typescript,您好我在Angular 9中实现了一个拦截器,当捕获idtoken不正确时,它会生成新的令牌,但不会再次发送请求,拦截器代码如下: import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; import { Observable } from 'rxjs'; impo
import { Injectable } from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
import { AuthService } from 'src/app/services/auth.service';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private auth:AuthService) {}
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
console.log ("solicitud interceptada correctamente!");
let data = JSON.parse(localStorage.getItem('data'));
let refreshToken = data['data'].refreshToken;
console.log('refreshToken',refreshToken);
return next.handle(request).pipe(catchError(err => {
console.log(err.error);
if (err.error.code === 401) {
console.log('Refresh Token');
if (err.error.message == "Token no valido.") {
console.log('Refresh Token');
let refresh={
"refreshToken":refreshToken
}
this.auth.getTokenRefresh(refresh)
.subscribe(respt =>{
// this.datar['data'].refreshToken=respt['data'].refreshToken;
data['data'].idToken=respt['data'].idToken;
data['data'].accessToken=respt['data'].accessToken;
this.auth.guardarToken(respt['data'].idToken);
this.auth.guardarRespuesta(data);
console.log(respt);
console.log("Datos Refrescar",data);
console.log("Id token Refrescar",respt['data'].idToken);
request = request.clone({
setHeaders: {
'Application': 'UEhBTlRPTVhfV0VC',
'Authorization': `Bearer ${respt['data'].idToken}`
}
});
// this.router.navigate(['/seguridad/gestion-usuarios']);
},(err) =>{
// this.error=err.error['message'];
// this.erroru=true;
console.log(err.error);
});
return next.handle(request);
//TODO: Token refreshing
}else {
//Logout from account or do some other stuff
}
}
return next.handle(request);
// return next.handle(request);
}));
}
}
从'@angular/core'导入{Injectable};
进口{
HttpRequest,
HttpHandler,
HttpEvent,
http拦截器
}来自“@angular/common/http”;
从“rxjs”导入{Observable};
从“rxjs/operators”导入{catchError};
从“rxjs”导入{throwError};
从'src/app/services/auth.service'导入{AuthService};
@可注射()
导出类AuthInterceptor实现HttpInterceptor{
构造函数(私有身份验证:身份验证服务){}
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
console.log(“requickud interceptada correctamente!”);
让data=JSON.parse(localStorage.getItem('data'));
让refreshToken=data['data'].refreshToken;
log('refreshToken',refreshToken);
返回next.handle(request).pipe(catchError(err=>{
console.log(err.error);
如果(err.error.code==401){
log(“刷新令牌”);
if(err.error.message==“令牌无效”){
log(“刷新令牌”);
让我们刷新={
“refreshToken”:refreshToken
}
this.auth.getTokenRefresh(刷新)
.订阅(respt=>{
//this.datar['data'].refreshtToken=respt['data'].refreshtToken;
data['data'].idToken=respt['data'].idToken;
data['data'].accessToken=respt['data'].accessToken;
this.auth.guardarToken(respt['data'].idToken);
此.auth.guardarrepuesta(数据);
控制台日志(respt);
console.log(“Datos Refrescar”,数据);
log(“Id token Refrescar”,respt['data'].idToken);
request=request.clone({
集合头:{
“应用程序”:“UEhBTlRPTVhfV0VC”,
'Authorization':`Bearer${respt['data'].idToken}`
}
});
//this.router.navigate(['/seguridad/gestion usuarios']);
},(错误)=>{
//this.error=err.error['message'];
//这个.erroru=true;
console.log(err.error);
});
下一步返回。处理(请求);
//TODO:令牌刷新
}否则{
//从帐户注销或做一些其他事情
}
}
下一步返回。处理(请求);
//下一步返回。处理(请求);
}));
}
}
我知道“return next.handle(request);”会再次生成请求,但我不知道为什么没有生成请求,我已经进行了大量调查,但没有找到解决方案,我希望您能提供帮助,直到刷新令牌API返回响应。如果您不知道如何在继续下一行代码之前等待http响应,请阅读“forkJoin”中的“async and wait”一词。我该如何做?我在等待方面没有太多经验