如何在没有AngularFire库的情况下从AngularInterceptor发送firebase IDToken?
我想通过我的Angular应用程序的每个http请求发送Firebase IDToken。我现在正在使用AngularFire库,拦截器按预期工作。我想删除AngularFire库,只想使用Firebase。我怎样才能达到同样的结果?以下是我目前的执行情况:如何在没有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
@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=>{
解析(令牌);
});
}否则{
拒绝(空);
}
},拒绝);
});
}
}