Angular 7:JWT到期时间检查错误

问题描述

我正在创建一个角度应用程序。目前,我想检查JWT的到期时间。我想在每个API调用之前检查JWT exp时间。 例如:

  1. https://example.com/get-user-details(超时,然后调用刷新令牌API)
  2. https://example.com/refresh-token(获取一个新的有效JWT令牌,存储在本地存储中,并完成第一个API调用-https://example.com/get-user-details

但是我遇到了错误。

未捕获(承诺):TypeError:您提供了“未定义”,其中 流是预期的。您可以提供一个Observable,Promise,Array或 可迭代的。

我认为它们是异步/等待功能的错误,但我无法解决此问题。

import {Inject,Injectable} from '@angular/core';
import {
    HttpClient,HttpErrorResponse,HttpEvent,HttpHandler,HttpInterceptor,HttpRequest,HttpResponse
} from '@angular/common/http';
import {Observable} from 'rxjs';
import {catchError,tap} from 'rxjs/operators';
import {SHttpConfig} from './http.conf';
import {StorageService} from '../../services/storage.service';
import {PopAlertService} from '../pop-alert/pop-alert.service';
import {Router} from '@angular/router';
import {JwtService} from '../../services/jwt.service';
import {getDecodedJWT} from '../../helpers/functions';

@Injectable()
export class SHttpInjectorService implements HttpInterceptor {
    cachedRequests: Array<HttpRequest<any>> = [];

    constructor(
        private storage: StorageService,private config: SHttpConfig,private pop: PopAlertService,private router: Router,private jwt: JwtService
    ) {
    }

    intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
        const user: any = this.storage.user;
        const addToken = !req.urlWithParams.includes('token');
        const token = user ? user.token : null;
        if (token && !req.url.includes('token=') && addToken) {
            this.modify(req,user,token).then(res => {
                req = res;
                return this.handleRequest(next,req,token);
            });
        } else {
            return this.handleRequest(next,token);
        }
    }

    private async modify(req,token) {
        let user_token = user.token;
        const expireDate = getDecodedJWT(token).exp;
        if (Date.now() >= expireDate * 1000) {
            const result = await this.jwt.getRefreshedJWT().toPromise();
            user_token = result.token;
            user.token = user_token;
            this.storage.user = user;
        }
        return req.clone({
            setHeaders: {Authorization: `Bearer ${user_token}`},setParams: {token: user_token}
        });
    }

    private handleRequest(next,token) {
        return next.handle(req).pipe(tap((event: HttpEvent<any>) => {
            if (event instanceof HttpResponse) {
                if (event.body.code === 401 && token) {
                    this.router.navigate(['/']).catch(err => {console.log(err); });
                    this.storage.removeData();
                    this.pop.open('Your Session has expired ');
                }
            }
        },(err: any) => {
            if (err instanceof HttpErrorResponse) {
                if (err.status === 401) {
                    this.collectFailedRequest(req);
                } else if (err.status === 0 && err.message.match('Http failure response')) {
                    this.pop.open('Couldn\'t get response from server');
                }
            } else {
                // tslint:disable-next-line:no-shadowed-variable
                this.router.navigate(['/']).catch(err => {console.log(err); });
            }
        }));
    }

    public collectFailedRequest(request): void {
        this.cachedRequests.push(request);
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)