Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有AngularFire库的情况下从AngularInterceptor发送firebase IDToken?_Angular_Firebase Authentication - Fatal编程技术网

如何在没有AngularFire库的情况下从AngularInterceptor发送firebase IDToken?

如何在没有AngularFire库的情况下从AngularInterceptor发送firebase IDToken?,angular,firebase-authentication,Angular,Firebase Authentication,我想通过我的Angular应用程序的每个http请求发送Firebase IDToken。我现在正在使用AngularFire库,拦截器按预期工作。我想删除AngularFire库,只想使用Firebase。我怎样才能达到同样的结果?以下是我目前的执行情况: @Injectable({ providedIn: 'root' }) export class RequestInterceptor implements HttpInterceptor { constructor(private

我想通过我的Angular应用程序的每个http请求发送Firebase IDToken。我现在正在使用AngularFire库,拦截器按预期工作。我想删除AngularFire库,只想使用Firebase。我怎样才能达到同样的结果?以下是我目前的执行情况:

@Injectable({
  providedIn: 'root'
})
export class RequestInterceptor implements HttpInterceptor {
  constructor(private af: AngularFireAuth) {}
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return this.af.idToken.pipe(
      mergeMap((token: string) => {
        if(!req.url.includes('auth')) {
          req = req.clone({
            setHeaders: {
              Authorization: `Bearer ${token}`
            }
          });
        }
        return next.handle(req);

      })
    );
  }
}
@可注入({
providedIn:'根'
})
导出类RequestInterceptor实现HttpInterceptor{
构造函数(私有af:AngularFireAuth){}
截取(req:HttpRequest,next:HttpHandler):可观察{
返回此.af.idToken.pipe(
合并映射((令牌:字符串)=>{
如果(!req.url.includes('auth')){
req=req.clone({
集合标题:{
授权:`Bearer${token}`
}
});
}
返回next.handle(req);
})
);
}
}

是否有一种方法可以使用普通firebase库实现相同的功能

我想我已经找到了解决这个问题的方法。但是,我不能100%确定这是否是一个最佳的解决方案。如果你们能阅读以下代码,我将不胜感激:

@Injectable({
  providedIn: 'root'
})
export class ReqInterceptorService implements HttpInterceptor {
  constructor() {}
  /*
  * Every outgoing Http request will go through this Http interceptor and append
  * Authorization nav-header to it.
  */
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    /* Firebase will refresh token automatically if expired */
    return from(this.getCurrentIdToken()).pipe(
      mergeMap(token => {
        console.log(token);
        req = req.clone({
          setHeaders: {
            Authorization: `Bearer ${token}`
          }
        });
        return next.handle(req);
      })
    )
  }

  getCurrentIdToken() {
    return new Promise((resolve, reject) => {
      const auth = firebase.auth();
      const unsubscribe = auth.onIdTokenChanged(user => {
        unsubscribe();
        if (user) {
          user.getIdToken().then(token => {
            resolve(token);
          });
        } else {
          reject(null);
        }
      }, reject);
    });
  }
}
@可注入({
providedIn:'根'
})
导出类ReqInterceptorService实现HttpInterceptor{
构造函数(){}
/*
*每个传出的Http请求都将通过此Http侦听器并追加
*授权导航头到它。
*/
截取(req:HttpRequest,next:HttpHandler):可观察{
/*如果令牌过期,Firebase将自动刷新令牌*/
从(this.getCurrentIdToken()).pipe返回(
合并映射(令牌=>{
console.log(令牌);
req=req.clone({
集合标题:{
授权:`Bearer${token}`
}
});
返回next.handle(req);
})
)
}
getCurrentIdToken(){
返回新承诺((解决、拒绝)=>{
const auth=firebase.auth();
const unsubscribe=auth.onIdTokenChanged(用户=>{
取消订阅();
如果(用户){
user.getIdToken()。然后(token=>{
解析(令牌);
});
}否则{
拒绝(空);
}
},拒绝);
});
}
}