【问题标题】:Could not parse auth token in rest realtime database (firebase)无法在 rest 实时数据库(firebase)中解析身份验证令牌
【发布时间】:2020-07-14 21:30:45
【问题描述】:

我的 Angular 应用中有一个实时数据库,并且正在使用 Firebase。我正在尝试在请求中使用作为参数附加的令牌来获取数据,如 RestAPI 的Firebase docs 所示。

但是,当我将令牌附加到数据时,我会收到 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 创建一个用户,然后在 activeUserBehaviorSubject 上使用 .next,以便使用电子邮件、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 问题要么未得到解答、部分得到解答但不起作用,要么使用了已弃用的 Database Secrets。

【问题讨论】:

  • 错误消息表明您实际上并未传递 Firebase 身份验证用户 ID 令牌。请编辑问题以准确显示您如何获得此值。
  • 添加了此代码。即使我手动将令牌添加到请求并在浏览器中提交,问题仍然存在
  • 您必须更具体。你传递的价值到底是什么?这是你所期望的吗?请阅读:stackoverflow.com/help/minimal-reproducible-example
  • 我在你的评论出现时添加了这个。应该有所有的代码。我最初没有包含代码,因为我认为我直接将令牌附加到 url 并且它仍然无法正常工作,将我的代码与手头的问题分离并且它可能是一个 firebase 问题
  • 看起来问题在于我正在使用刷新令牌...

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


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。我现在可以看到这是正确的使用方法。你能帮我从getIdToken()异步获取字符串值吗?
  • 我认为 API 文档很清楚。该方法返回一个用您需要的字符串解析的承诺。
  • 非常感谢您的帮助。 ... res.user.getIdToken(true).then(token =&gt; { this.handleAuthentication(res.user.email , res.user.uid, res.user.displayName, token ); ...
猜你喜欢
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2017-12-26
  • 2020-08-05
  • 2013-02-16
相关资源
最近更新 更多