在尝试处理令牌之前,tokenGetter方法不会等待承诺完成

时间:2018-04-08 12:59:01

标签: jwt angular-promise refresh-token

我正在使用Jwt令牌进行身份验证,并使用拦截器为请求添加访问令牌。我有一个getToken()方法,它检查令牌的有效性并调用服务获取新的一组令牌。该方法返回了promise,但请求在完成之前已经接受了承诺并且无法获得更新的令牌。

以下是我的代码:

export class TokenService {

refresh = false;

constructor(public injector: Injector) {
}

public getToken(): string | Promise<string> {
    const jwtHelper = new JwtHelperService();

    let token = localStorage.getItem('token');
    let refreshToken = localStorage.getItem('refreshToken');

    if (!token || !refreshToken) {
        return null;
    }

    if (jwtHelper.isTokenExpired(token)) {
        if (jwtHelper.isTokenExpired(refreshToken)) {
            return null;
        } else {
            let tokenPromise;
            if (!this.refresh) {
                this.refresh = true;
                tokenPromise = this.promiseFromObservable(this.getTokenService(localStorage.getItem('refreshToken')));
            }
            return tokenPromise;
        }
    } else {
        return token;
    }
}

getTokenService(refreshToken: string) {
    let http = this.injector.get(HttpClient);

    const httpOptions = {
        headers: new HttpHeaders({
            'Authorization': 'Bearer ' + refreshToken
        })
    };
    return http.post<Tokens>(location.origin + '/LiveTime/services/v1/auth/tokens?locale=en', null, httpOptions);
}

promiseFromObservable(o): Promise<string> {
    return new Promise((resolve, reject) => o.subscribe((token: Tokens) => resolve(token.token),reject(), err => { console.log(err); return null; }))
        .then((token: Tokens) => {
            localStorage.setItem('token', token.token);
            localStorage.setItem('refreshToken', token.refreshToken);
            this.refresh = false;
            return token.token;
        },
            err => { console.log(err); return null; }
        )
        .catch((error) => { console.log(error);reject();
        });
}

}

有人能告诉我这段代码有什么问题吗?

0 个答案:

没有答案