在以角度4

时间:2017-06-14 05:21:42

标签: angular firebase firebase-authentication

我的应用使用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但是所有显示类型错误。过去两天我一直试图解决这个问题。因为,这是一个通用的工作流程,我认为有人可以帮助我使用标准解决方案。

2 个答案:

答案 0 :(得分:3)

你不是在追求你的承诺。以下是如何执行此操作的示例:

&#13;
&#13;
//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;
&#13;
&#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