【问题标题】:firebase.auth().createCustomToken is undefined on web appfirebase.auth().createCustomToken 在网络应用程序上未定义
【发布时间】:2016-08-29 01:12:13
【问题描述】:

我正在尝试为使用 Firebase 的网络应用创建“记住我”功能。

我的目标是,当用户单击“记住我”并成功登录时,他们的身份验证令牌会使用 localStorage 存储,并在下次访问时自动登录(为了安全起见,我更喜欢将其原始凭据存储在 localStorage目的)。

但是,当我尝试调用 firebase.auth().createCustomToken 时,我收到一条错误消息,提示它不存在。这是对firebase的错误方法还是错误的函数调用?谢谢!

这是我的代码示例:

var customToken = firebase.auth().createCustomToken(user.uid);
localStorage.setItem("savedToken", customToken);

然后我打算用这条线重新登录:

firebase.auth().signInWithCustomToken(localStorage.getItem("savedToken")).then(function() {

【问题讨论】:

  • 请出示您的代码。当我们可以看到您的尝试时,调试会容易得多。

标签: javascript firebase firebase-authentication


【解决方案1】:

firebase.auth().createCustomToken 仅在服务器 API 中可用。

要使用电子邮件和密码进行身份验证并获取会话令牌,请尝试以下操作:

firebase.auth().signInWithEmailAndPassword(email, password)
  .then(function(user) {
    user.getToken().then(function(token) {
      localStorage.setItem("savedToken", token); // store the token
    });
  })
  .catch(function(error) {
    // handle error...
  });

这也适用于其他身份验证方法;只需使用User.getToken。稍后,如果您有一个令牌(仍在客户端上),并且您想使用它进行身份验证,只需执行您当前正在执行的操作:

var token = localStorage.getItem("savedToken"); // get stored token
firebase.auth().signInWithCustomToken(token).catch(function(error) {
  // handle error...
});

上面的代码不起作用,因为signInWithCustomToken 仅适用于您的服务器使用createCustomToken 铸造的令牌。我不确定如何使用电子邮件/密码令牌进行身份验证。

【讨论】:

  • 谢谢,但这实际上是旧文档,不幸的是,此代码很少适用于 Firebase 3.0 及更高版本(这是我正在使用的)。
  • 哦,好的,抱歉。这是你想做的吗?
  • @LiorHirschfeld 为 Firebase 3.x 编辑
  • 谢谢,我认为这可能已经解决了获取分配给用户的自定义令牌的错误,但我仍然无法使用它登录,因为我收到错误“自定义令牌格式不正确”时我使用上面的确切代码。知道问题可能是什么吗? (我很确定本地存储的令牌分配工作正常,因为当我在登录尝试时记录令牌时,我得到一个看似随机的字符串)。
  • 我想我知道问题出在哪里,但在发布之前,您是否使用 Firebase 的电子邮件/密码身份验证?
【解决方案2】:

创建自定义令牌需要有权访问您的 Firebase 项目的私钥/服务帐号。此密钥是获取 Firebase 项目访问权限的主密钥,知道它可以提供无限访问权限。

由于知道私钥的人可以无限制地访问 Firebase 项目,因此永远在客户端上铸造自定义令牌是没有意义的。您可以简单地从 Firebase 数据库和存储服务中删除所有安全性。

要使用自定义令牌验证客户端,mint a custom token on an app server 并将其(安全地)传递给客户端。然后use the custom on the clientsignInWithCustomToken。这样,只有您的应用服务器必须知道服务帐户/私钥。

【讨论】:

  • 谢谢。你知道使用 getToken() 方法登录,这正是我最初的目标吗?我的最终目标是允许用户在不本地存储用户名和密码的情况下再次登录 - 有没有更好的方法来做到这一点?
  • 用户登录时自动存储用户当前token,再次访问时恢复。听起来您缺少 onAuthStateChanged 处理程序:firebase.google.com/docs/auth/web/…
  • 谢谢,但我尝试在我的页面加载后运行“var user = firebase.auth().currentUser”这一行,我总是得到没有用户登录的结果,即使一个用户已经登录在页面刷新之前登录。你知道为什么当前令牌没有被恢复吗?
  • 这就是为什么我说onAuthStateChanged 而不是currentUser ;-) Firebase 混合使用短期访问令牌和长期 ID 令牌。很可能需要刷新访问令牌。
猜你喜欢
  • 2017-08-09
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多