Как отправить firebase IDToken из Angular Interceptor без библиотеки AngularFire? - PullRequest
0 голосов
/ 08 марта 2020

Я хочу отправлять Firebase IDToken с каждым http-запросом из моего Angular приложения. Сейчас я использую библиотеку 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);

      })
    );
  }
}

Есть ли способ, с помощью которого я могу использовать простую библиотеку Firebase для достижения той же функциональности?

1 Ответ

0 голосов
/ 08 марта 2020

Я думаю, что нашел способ решить это. Но я не уверен на 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);
    });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...