我的应用使用firebase对用户进行身份验证。我使用标头中提供的令牌向后端服务器发出请求。最初,我将令牌存储在变量中,并且我的所有服务文件都会访问此变量,以便令牌在发出请求之前将其添加到标头中。
由于无法以这种方式检查令牌的到期,并且最终服务器返回了请求的错误,因此这没有多大用处。现在,Iam尝试从firebase提供的方法获取令牌,但由于这是一个“承诺”,控制流不会等待响应,因此在请求中发送空白令牌。 / p>
//in a general service file
getData(): Observable<any> {
let tokenOptions = this.authService.getTokenHeader();
return this.http.get(this.endPoints.dataUrl, tokenOptions)
.map(res => {
this.data = res.json().data;
return this.data;
})
.catch(( error: any ) => Observable.throw( error.json().error || 'Server error' ))
}
//in authService file
getTokenHeader() {
const token = this.getToken();
console.log(token);
let tokenHeader = new Headers({ 'Authorization': token });
tokenHeader.append('Content-Type', 'application/json');
let tokenOptions = new RequestOptions({ headers: tokenHeader });
return tokenOptions;
}
getToken() {
firebase.auth().currentUser.getIdToken(true)
.then(token => return token);
}
我尝试了各种方法,比如尝试在firebase方法的响应中返回tokenheader但是所有显示类型错误。过去两天我一直试图解决这个问题。因为,这是一个通用的工作流程,我认为有人可以帮助我使用标准解决方案。
答案 0 :(得分:3)
你不是在追求你的承诺。以下是如何执行此操作的示例:
//in a general service file.
getData(): Observable<any> {
return new Observable(observer => {
this.authService.getTokenHeader()
.then(tokenOptions => {
return this.http.get(this.endPoints.dataUrl, tokenOptions)
.map(res => {
this.data = res.json().data;
observer.next(this.data);
observer.complete();
})
})
.catch(( error: any ) => {
observer.error(error);
observer.complete();
});
});
}
//in authService file
getTokenHeader() {
return firebase.auth().currentUser.getIdToken()
.then(token => {
console.log(token);
let tokenHeader = new Headers({
'Authorization': token
});
tokenHeader.append('Content-Type', 'application/json');
let tokenOptions = new RequestOptions({
headers: tokenHeader
});
return tokenOptions;
});
}
&#13;
答案 1 :(得分:0)
定义您的方法以返回Promise
并使用then
来访问这样的值:
getTokenHeader() : Promise<any>
{
return new Promise((resolve,reject)=>
{
this.getToken()
.then(token=>
{
console.log(token);
let tokenHeader = new Headers({ 'Authorization': token });
tokenHeader.append('Content-Type', 'application/json');
let tokenOptions = new RequestOptions({ headers: tokenHeader });
resolve(tokenOptions);
})
.catch(()=>{/*do some error handling here*/});
});
}
getToken() : Promise<any>
{
return new Promise((resolve,reject)=>
{
firebase.auth().currentUser.getIdToken(true)
.then(token => resolve(token))
.catch(()=>reject());
});
}
最终也将getTokenHeader
用作Promise
。