我有一个Ionic 2应用程序,我希望在其中实现注销功能。我想在本地存储中将Json Web Token的值设置为null,然后在设置该值后,将用户发送到登录页面。
我遇到的问题是,在将用户带到登录页面之前,应用程序没有等待设置JWT的值。这是一个问题,因为在登录页面上,我有一个功能,如果他们有一个有效的JWT,则自动记录用户。由于程序没有阻塞并等待在存储中设置值,因此用户在注销后立即重新登录。
如何在将用户发回登录页面之前等待令牌的值?
退出功能:
logout() {
this.storage.ready().then(() => {
this.storage.set('token', '').then(data => {
this.navCtrl.setRoot(LoginPage);
});
});
CheckAuthentication功能:
checkAuthentication() {
return new Promise((resolve, reject) => {
this.storage.get('token').then((value) => {
this.token = value;
let headers = new Headers();
headers.append('Authorization', this.token);
this.http.get('apiURL', { headers: headers })
.subscribe(res => {
resolve(res);
}, (err) => {
reject(err);
});
});
});
}
IonViewWillLoad:
ionViewWillLoad(){
//Check if already authenticated
this.auth.checkAuthentication().then((res) => {
console.log("Already authorized");
this.loading.dismiss();
this.navCtrl.setRoot(HomePage);
}, (err) => {
console.log("Not already authorized");
this.loading.dismiss();
});}
答案 0 :(得分:1)
你可以在这里做一些事情。
首先,我会重构代码,使其更具可读性。如果您看到我如何拥有以下功能,您会注意到我们正在利用自然提供的承诺,我们可以将它们链接在一起而无需嵌套我们的then()
。 / p>
在checkAuthentication()
中,您不需要像现在这样创建Promise。您可以将http Observable作为承诺返回。如果http调用成功,那么promise将解决。如果http调用失败,则生成的promise将拒绝。
最后,我会尝试使用ionViewDidLoad
代替willLoad
。
logout() {
this.storage.ready()
.then(() => this.storage.set('token', ''))
.then(data => this.navCtrl.setRoot(LoginPage))
}
checkAuthentication() {
return this.storage.get('token')
.then((value) => {
this.token = value;
let headers = new Headers();
headers.append('Authorization', this.token);
return Observable.toPromise(
this.http.get('apiURL', { headers: headers })
);
});
}
ionViewDidLoad() {
this.auth.checkAuthentication()
.then((res) => {
console.log("Already authorized");
this.loading.dismiss();
this.navCtrl.setRoot(HomePage);
})
.catch((err) => {
console.log("Not already authorized");
this.loading.dismiss();
});
}

答案 1 :(得分:0)
在退出功能中,它应该删除令牌而不是将其设置为空白''。因为注销后令牌仍然存在于存储中。
this.storage.removeItem('token')