无法解析其余实时数据库(Firebase)中的身份验证令牌

时间:2020-04-02 19:28:44

标签: angular firebase firebase-realtime-database firebase-authentication

我的Angular应用程序中有一个实时数据库,正在使用Firebase。我正在尝试在请求中获取带有参数作为参数附加的令牌的数据,如Firebase docs for 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的{​​{1}}上使用BehaviorSubject,以便向用户添加电子邮件,uid,令牌和显示名称。然后在activeUser函数中使用此令牌从数据库中获取数据。

我当前的代码是:

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

当我发送Firebase请求以使用诸如{ "error" : "Could not parse auth token." }之类的请求来恢复某些锻炼时,无论我如何发送请求,它似乎总是会返回相同的错误。

我的实时数据库规则如下:

https://myapp.firebase.io/workouts.json?auth=MYTOKEN

如果我将这些规则更改为:

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

并完全删除我的http请求中的令牌,然后就可以了。这只是打开这些规则的时间,我将令牌附加到API请求。

我这里缺少什么吗?所有问类似问题的StackOverflow问题都无法回答,部分回答但无法正常工作,或者使用了已弃用的数据库密钥。

1 个答案:

答案 0 :(得分:0)

您传递了错误的值。 res.user.refreshToken不是ID令牌。刷新令牌是用于定期获取新ID令牌的另一件事。

您将必须调用getIdToken()来异步获取该字符串值。