【问题标题】:How to verify a user's ID token in firestore using Javascript?如何使用 Javascript 在 Firestore 中验证用户的 ID 令牌?
【发布时间】:2020-11-03 08:32:00
【问题描述】:

我正在构建一个 React Native 应用程序,并使用 Firebase,更具体地说是 Firestore,来管理我的数据。我目前的目标是在我的应用程序上实现自动登录功能,如果用户退出应用程序,我希望他们保持登录状态,除非他们在退出应用程序之前手动点击Sign Out 按钮。这是我目前执行此操作的过程:

当用户登录应用时,我通过以下方式登录: firebase.auth().signInWithEmailAndPassword(email, password)。 然后我通过以下方式获取他们的 idToken:

  let authIdToken = "";
  firebase
    .auth()
    .currentUser.getIdToken(true)
    .then(function (idToken) {
      authIdToken = idToken
    })
    .catch(function (error) {
      console.log(error)
    });

然后我想将此令牌保存到手机中,因此当用户再次打开应用程序时,我可以获取此令牌并检查其有效性。如果它有效,那么我可以使用他们的 idToken 登录用户。在 react native 中,我可以这样做:

AsyncStorage.setItem(
    "userData",
    JSON.stringify({
      token: token,
    })
  );

现在当应用加载时:

const startScreen = props => {
   useEffect(() => {
    const tryLogin = async () => {
     const userData = await AsyncStorage.getItem("userData");
     const transformedData = JSON.parse(userData);
     const { token } = transformedData;

     await firebase
       .auth()
       .verifyIdToken(token, true)
       .then((payload) => {
         console.log(true)
       })
       .catch((error) => {
         if (error.code == "auth/id-token-revoked") {
           // Token has been revoked. Inform the user to reauthenticate or signOut() the user.
           console.log("revoked")
         } else {
           console.log("error")
         }
       });
    };
    tryLogin();
 }, []);

问题:当我尝试以这种方式验证令牌时,遇到以下错误:firebase.auth().verifyIdToken is not a function. 我通读了文档,不确定如何使用 JS 验证此令牌。我该如何验证?让我知道我的验证过程是否不正确以及应该如何完成。我不熟悉使用 Firestore 和进行一般身份验证,并希望学习如何以正确的方式进行。

另一个有用的说明:这是我配置 Firestore 的方式:!firebase.apps.length ? firebase.initializeApp(firebaseConfig) : {};

谢谢!

【问题讨论】:

    标签: javascript reactjs firebase google-cloud-firestore firebase-authentication


    【解决方案1】:

    然后我想将此令牌保存到手机中,这样当用户再次打开应用程序时,我可以获取此令牌并检查其有效性。

    这是完全没有必要的。 Firebase Auth 持久化登录用户,并自动刷新令牌,您无需执行任何操作。您需要做的就是听取令牌更新何时可用,并根据需要对新令牌采取行动。您可以使用 onIdTokenChanged 建立 ID 令牌侦听器,如链接的 API 文档中所示:

    firebase.auth().onIdTokenChanged(function(user) {
      if (user) {
        // User is signed in or token was refreshed.
      }
    });
    

    一旦你有了这个令牌,你就知道用户已经成功登录了。没有什么可做的了。无需使用它来登录。

    此外,您无法在前端验证令牌。您正在查看的 verifyIdToken 方法仅适用于 Admin SDK,它仅在后端运行。这个想法是您在前端获取令牌,然后将其传递到后端,如documentation for the Admin SDK 中所述。后端使用它来安全地确定前端的用户是否是他们所说的人。

    由于您没有说是否有后端,因此可能根本不需要处理此令牌。如果您只想知道用户何时登录(即使他们只是在离开后返回页面,然后您可以跳过上面的所有内容,只需使用auth state observer。同样,Firebase Auth 会保留有关用户的信息,因此您不必再次登录。观察者会告诉当自动登录完成时,或者他们根本没有登录时。

    【讨论】:

    • 啊,好吧。我没有使用后端,所以我可能根本不需要验证令牌?抱歉,如果这是一个明显的问题,但如果我没有将令牌存储在设备上,应用程序如何知道在关闭之前哪个用户之前登录过?
    • 正如我所说,Firebase Auth SDK 会保留所需的信息。
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2018-04-20
    • 2017-06-25
    • 2018-04-18
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多