2017-05-31 58 views
1

我正在使用angular2和ionic 2s框架存储。我打了几个电话给我的API,在他们面前我打电话refresh()函数刷新令牌,如果需要的话。Token在HTTP请求之前刷新,但新的令牌未与请求一起发送

问题的一个示例:用户在搜索栏中开始键入“AB”并且令牌过期。用户现在键入“C”,refresh()被调用,但不会与请求一起发送令牌,但如果用户在提供令牌后立即按下“D”,则我的猜测是在令牌之后正在调用API从存储已经被删除,但它被保存

get(): Promise<any> { 
    return this.storage.get('token_id').then(token_id => { 
    this.token_id = token_id; 
    }); 
} 

set(token_id) { 
    this.storage.set('token_id', token_id); 
} 

refresh(): Observable <any> { 

    let obs = Observable.fromPromise(this.get()) 
    .filter(() => this.jwtHelper.isTokenExpired(this.token_id)) 
    .flatMap(() => this.authHttp.get('http://api.app/api/refresh?token_id=' + this.token_id)); 
    obs.subscribe((response: Response) => { 
    this.token_id = response.json().token_id; 
    this.set(this.token_id); 
    }, (error: Response) => { 
    console.log(error); 
    }); 
    return obs; 
} 

服务,使调用刷新订阅了搜索()调用

search(key): Observable<any> { 

    this.userService.refresh(); 

    return this.authHttp.get('http://' + keyword) 
    .map(
     (response: Response) => { 
     return response.json(); 
     }, 
    (error: Error) => { 
     console.log(error); 
    } 
    ); 
} 

组件之前,()调用

onSearch(event) 
{ 
    let key = event.target.value; 

    this.searchService.search(key) 
    .subscribe(
     (prods: SearchInterface[]) => this.prods = prods, 
     (error: Response) => { 
     } 
    ); 
} 
+0

当如果令牌到期,则服务器将用401或403错误代码响应搜索API调用获得令牌。因此,如果您在调用刷新令牌后在搜索api调用上收到该错误,则只需再次调用相同的搜索API即可。 – SAJ

回答

0

当登录成功时,您需要将令牌保存在localStorage中。

localStorage.setItem("token", this.token); 

你可以用

localStorage.getItem("token") 
+0

它正在保存在存储器中作为响应 – ghan