如何在angular中实现刷新令牌?

时间:2020-02-02 13:03:56

标签: angular angular-http-interceptors refresh-token

我正在尝试在我的角度应用程序中实现刷新令牌。我写了一个HTTP拦截器,每当遇到401错误时,它都会尝试获取新的访问令牌。我不知道为什么,但这不起作用。我仍然收到401回应。

2 个答案:

答案 0 :(得分:0)

您需要检查响应代码是否为401,然后请求刷新令牌,并在接收到响应过程挂起的请求后等待响应。 refresh token with http interceptor

答案 1 :(得分:0)

如果需要,请在请求之前生成refreshToken

export class HttpRequestInterceptor implements HttpInterceptor {
constructor(private router: Router, private service: AuthService) { }

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

    return from(this.tokenHandler(request)).pipe(mergeMap((req: HttpRequest<any>) => {
        return next.handle(req).pipe(catchError(err => {
            if ([401].indexOf(err.status) != -1) {
                // auto logout if 401 response returned from api
            }                
            else {                    
                throw err;
            }

            return EMPTY;
        }));
    }));
}

private async tokenHandler(request: HttpRequest<any>): Promise<HttpRequest<any>> {
    if (request.url.indexOf("REFRESHTOKEN_URL") == -1) {
        await this.service.GenerateNewTokenIfNeed(); //Important this function would be async and put httpClient call to ToPromise() and await it. Save token somewhere and get from there to #token# place
    }
    else {
        //RefreshTokenRequest
    }

    const authReq = request.clone({
        setHeaders: {
            Authorization: "Bearer #token#"
        },
    });

    return authReq;
}