Как добавить токен Firebase в запросе JavaScript (получение 401) - PullRequest
1 голос
/ 20 января 2020

Я прочитал тонны сообщений stackoverflow и docs , но мне все еще что-то не хватает. Я использую базу данных Firebase в реальном времени. Если я устанавливаю правила всегда true (аутентификация не требуется) и удаляю перехватчик, все работает нормально. После добавления перехватчика и расширения запросов к Firebase:

  • параметр запроса ?auth_token=<token here>
  • заголовок Authorization: Bearer <token here>

Я получаю 401 ошибка (Несанкционированный запрос.). Похоже, мой auth_token по какой-то причине неверен. Любая идея, почему и как это исправить?

Заранее спасибо!

Код ниже:

Служба аутентификации

import 'firebase/auth';
import 'firebase/database';

import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import * as firebase from 'firebase/app';

import { environment } from './../../environments/environment';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  public user: firebase.User;
  public token: string;

  constructor(private router: Router) {
    this.initFirebase();
  }

  initFirebase() {
    firebase.initializeApp({
      apiKey: environment.firebase.apiKey,
      databaseURL: environment.firebase.databaseURL
    });
    const auth = firebase.auth();
    auth.onAuthStateChanged(firebaseUser => {
      this.user = firebaseUser;
      if (firebaseUser) {
        firebaseUser.getIdToken().then(token => this.token = token);
      } else {
        this.token = null;
      }
    });
  }
}

Перехватчик Firebase (пробовал предоставление токена аутентификации в виде: заголовка или параметра запроса)

import { HttpHandler, HttpInterceptor, HttpParams, HttpRequest } from '@angular/common/http';
import { Injectable } from '@angular/core';

import { AuthService } from './auth.service';

@Injectable()
export class FirebaseAuthInterceptorService implements HttpInterceptor {
  constructor(private auth: AuthService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler) {
    if (request.url.indexOf('firebaseio.com') === -1 || !this.auth.user) return next.handle(request);
    const params = new HttpParams();
    params.append('access_token', this.auth.token);
    const newRequest = request.clone({
      // headers: request.headers.append('Authorization', 'Bearer ' + this.auth.token)
      setParams: {
        access_token: this.auth.token
      }
    });
    return next.handle(newRequest);
  }
}
...