在我的离子应用程序中,我检查用户是否通过isAuthenticated
方法进行了身份验证。
在isAuthenticated()
中,我检查存储中是否有有效的令牌。
如果访问令牌已过期,则刷新令牌,然后再次返回新的访问令牌。
我的问题是,当我尝试使用refreshToken
方法刷新令牌时,应用程序不会等到完成时才将访问令牌返回为空。
export class AuthService {
token: JwtToken;
isAuthenticated(): Promise<boolean> {
return this.getToken().then(token => {
return token != null;
});
}
getToken(): Promise<JwtToken> {
return this.storage.get('token').then(async (token: JwtToken) => {
if (token == null) {
return null;
}
const jwtHelper = new JwtHelperService();
if (jwtHelper.isTokenExpired(token.access_token)) {
console.log('1');
// I need wait until the function below finished
await this.refreshToken(token);
console.log('3');
// and then return refreshed access token
return this.token;
} else {
return token;
}
});
}
async refreshToken(token: JwtToken) {
console.log('2-1');
return await this.http.post('http://api.com/auth/refresh', {refresh_token: token.refresh_token}).subscribe(async (res: JwtToken) => {
console.log('2-2');
this.token = res;
await this.setToken(res);
console.log('2-3');
return this.token;
});
}
}
这是控制台输出:
1
2-1
3
2-2
2-3
当我需要它的时候
1
2-1
2-2
2-3
3
它以某种方式忽略了await refreshToken(token)
...
答案 0 :(得分:0)
解决方案是使用async,这样等待: 如果要调用函数RefereshToken: let result = await RefereshToken(argument); 以及RefereshToken原型的功能,您应该像这样: 异步refreshToken(令牌:JwtToken){ 返回this.http.post('http://api.com/auth/refresh',{refresh_token:token.refresh_token})。subscribe(async(res:JwtToken)=> { this.token = res; 等待this.setToken(res); 返回this.token; }); }
答案 1 :(得分:0)
这个question帮助我解决了问题。
我这样更改了refreshToken
:
refreshToken(token: JwtToken) {
return new Promise(resolve => {
this.http.post('http://api.com/auth/refresh', {refresh_token: token.refresh_token}).subscribe(async (res: JwtToken) => {
this.token = res;
await this.setToken(res);
resolve();
});
});
}