Не удалось проанализировать токен аутентификации в базе данных реального времени отдыха (firebase) - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть база данных реального времени в моем приложении Angular, и я использую Firebase. Я пытаюсь получить данные с токеном, прикрепленным в качестве параметра в моем запросе, как показано в Документах Firebase для RestAPI.

Однако, когда я прикрепляю токен к данным, я получаю обратно 401 error "could not parse auth token".

Я пробовал этот запрос внутри и снаружи моего кода только для получения одинакового результата.

Токен аутентификации исходит непосредственно от AngularFireAuth, который был создан в моем AuthService при регистрации:

activeUser = new BehaviorSubject<User>(null);
...
signup(email: string, password: string, name: string) {
  return this.firebaseAuth.auth
    .createUserWithEmailAndPassword(email, password)
    .then(res => {
      res.user.updateProfile({
        displayName: name
      });

      this.handleAuthentication(
        res.user.email,
        res.user.uid,
        res.user.displayName,
        res.user.refreshToken
      );
      return res;
    });
}

handleAuthentication(
  email: string,
  uid: string,
  displayName: string,
  token: string
) {
  const user = new User(email, uid, displayName, token);
  this.activeUser.next(user);
}
...

Итак, я создаю пользователя с AngularFireAuth, а затем использую .next на BehaviorSubject из activeUser, чтобы добавить пользователя с адресом электронной почты, uid, токеном и отображаемым именем. Этот токен затем используется в функции fetchWorkouts() для получения данных из базы данных.

Мой текущий код:

fetchWorkouts() {
  return this.authService.activeUser.pipe(
    take(1),
    exhaustMap(activeUser => {
      return this.http.get<Workout[]>(
        "https://velo-coach-app.firebaseio.com/workouts.json?auth=" + activeUser.token
      );
    }),
   ...
}

Я также пробовал:

fetchWorkouts() {
  return this.authService.activeUser.pipe(
    take(1),
    exhaustMap(activeUser => {
      return this.http.get<Workout[]>(
        "https://velo-coach-app.firebaseio.com/workouts.json",
          {
            params: new HttpParams().set('auth', activeUser.token)
          }
        );
      );
    }),
   ...
}

Я также попытался просто вставить весь токен в браузер: https://myapp.firebase.io/workouts.json?auth=MYTOKEN. Все это приводит к одной и той же проблеме: { "error" : "Could not parse auth token." }

Когда я отправляю запрос Firebase, чтобы вернуть некоторые тренировки с таким запросом: https://myapp.firebase.io/workouts.json?auth=MYTOKEN, независимо от того, как я отправляю запрос, кажется, всегда возвращайте одну и ту же ошибку.

Правила моей базы данных реального времени следующие:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

Если я изменю эти правила на:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

и полностью удалим токен в моем запросе http, тогда это работает. Вопрос только в том, когда эти правила включены, и я прикрепляю токен к запросу API.

Есть что-то, чего мне здесь не хватает? Все вопросы StackOverflow, задающие что-то похожее на это, либо остаются без ответа, частично отвечают, но не работают, либо используют устаревшие секреты базы данных.

1 Ответ

0 голосов
/ 02 апреля 2020

Вы передаете неправильное значение. res.user.refreshToken это не идентификационный токен. Refre sh токены - это другая вещь, используемая для периодического получения новых токенов ID.

Вам придется вызвать getIdToken () , чтобы асинхронно получить это строковое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...