首页 > 解决方案 > Firebase.auth 错误,400 错误请求

问题描述

我在使用 Firebase 开发系统时发现了一个奇怪的错误,服务 url 包含用户数据。

用户数据如下。

    {
      "uid": "kt9Hcp2FbYbBvvIeSHHa1RbvHcv2",
      "displayName": "Anonymous 901",
      "photoURL": null,
      "email": null,
      "emailVerified": false,
      "identifierNumber": null,
      "isAnonymous": true,
      "providerData": [

      ],
      "apiKey": "MyApiKeyString",
      "appName": "MyAppName",
      "authDomain": "my.auth.domain",
      "stsTokenManager": {
        "apiKey": "MyApiKeyString",
        "refreshToken": "refreshTokenString",
        "accessToken": "accessTokenString",
        "expirationTime": 1532451863076
      },
      "redirectEventId": null
    }

我对上述匿名用户数据进行编码,并将其包含在服务 url 中。( http://myserviceurl?userdata=encodedUserData )

在系统内部接收该 url,firebase 创建一个用户对象,该用户数据包含在 url 中。

此 url 的目的是在任何浏览器中使用特定用户的信息。

但是,当我调用该服务 url 时,有时系统会很好地创建用户对象,有时会出错 - 400 Bad request errors with https://www.googleapis.com/identitytoolkit/v3/relyingparty/setAccountInfo?key=MyApiKeyString

错误数据如下,

    {
      "error": {
        "code": 400,
        "message": "TOKEN_EXPIRED",
        "errors": [
          {
            "message": "TOKEN_EXPIRED",
            "domain": "global",
            "reason": "invalid"
          }
        ]
      }
    }

几个小时后它运行良好,但我没有改变任何东西。

我找不到确切的错误点,但我怀疑在观察身份验证状态时或在此步骤之前发生错误。

这是代码片段

    @bind
    private makeUserLoadingPromise(): Promise<void> {
      let unSubscribe: () => void;
      return new Promise<void>((resolve, _reject) => {
        const onInitialized = this.makeOnInitializedAuthStateChanged(resolve);
        unSubscribe = this.auth.onAuthStateChanged(onInitialized);
      }).then(() => {
        unSubscribe();
        this.auth.onAuthStateChanged(this.onAuthStateChanged);
      });
    }

    @bind
    private makeOnInitializedAuthStateChanged(resolve: () => void) {
      return (user: firebase.User | null) => {
        this.user = user;
        resolve();
      };
    }

    @bind
    private onAuthStateChanged(user: firebase.User | null) {
      this.user = user;
    }

或者它可能与过期时间有关?

我找不到有关这种情况的任何提示。

任何意见,将不胜感激。

标签: firebasefirebase-authenticationhttp-status-code-400

解决方案


目前尚不清楚您在做什么,但您似乎在错误且不安全地使用 API。普通用户对象包含一个不确定的刷新令牌。通过 URL 传递它是一个非常糟糕的主意。

首先不要依赖内部实现,它可能会发生变化。要在您的后端获取用户的信息,正确的方法是使用官方支持的 API 获取用户的 ID 令牌,例如user.getIdToken(),然后将其传递给您的服务器。

在您的服务器上,您可以通过 Firebase Admin SDK: 对其进行验证admin.auth().verifyIdToken(idToken)。然后你知道这是一个真正的认证用户。如果您需要完整的用户信息,您可以使用令牌中的解码用户 ID 查找它:admin.auth().getUser(decodedIdToken.sub)


推荐阅读