我的Angular 2
應用程序中有一個非常棘手的情況。在我的身份驗證服務中,我有一個功能loggedIn
,它從本地存儲中讀取jwt訪問令牌,並檢查它是否過期並用於關閉路由。這就是所謂的canActivate
實現:如何限制HTTP呼叫,直到前一個完成
canActivate(....):Observable<boolean>{
return this.checkLogin();
}
checkLogin():Observable<boolean>{
return this._authSvc.isLoggedIn();
}
///AUTHSERVICE
isLoggedIn():Observable<boolean> {
let ex = tokenNotExpired('access_token');
if (ex) {
let jwt = new JwtHelper();
let t = jwt.decodeToken(localStorage['access_token']);
if (t.Id) {
this.Id = t.Id;
}
}
return Observable.of(new Boolean()).map(x => ex);
}
最近,我實現了刷新在後端(ASP.Net Web API 2
)令牌的能力。現在,想法是刷新訪問令牌,如果它使用刷新令牌過期。我試圖從isLoggedIn
方法中找到它。從下面的功能
if(ex){
}else{
return this.refreshToken();//<---NEW OBSERVABLE
}
:如果訪問令牌過期,我將返回Observable<boolean>
作爲
/*method to refresh the access token*/
refreshToken():Observable<boolean>{
//setup stuff
var res= this.http.post(url,data,opts).map(r=> data=r.json());
res.subscribe(data=>{
localStorage['access_token'] = data.access_token;
localStorage['refresh_token'] = data.refresh_token;
let jwt = new JwtHelper();
let t = jwt.decodeToken(localStorage['access_token']);
if (t.Id) {
this.Id = t.Id;
}
}, error=>{console.log(error);
});
return res;
}
但是,這是造成所有的地獄衝出重圍。有無數請求全部失敗(因爲第一個請求重置refresh token
)。
我想要做的是隻發出一個請求,即使該功能從canActivate
多次觸發。它有可能以任何方式?
是的,我已經仔細考慮過,甚至嘗試過,但因爲我需要返回'Observable'來消耗鏈條,它改變了簡單的事情'return'不起作用。 –
TheVillageIdiot
我不確定你的意思。你正在做什麼與返回的訂閱? –
是的,它最終用於'CanActivate'。 – TheVillageIdiot