【问题标题】:Persist Firebase user for Node.js client application为 Node.js 客户端应用程序保留 Firebase 用户
【发布时间】:2019-09-07 01:18:29
【问题描述】:

我正在使用 Firebase 构建 Node.js 命令行界面 (CLI) 用于与后端的身份验证。我想避免让用户在每次运行命令时都输入密码。相反,我想实现一个“登录”流程,将凭证保存到文件系统中,该凭证可用于后续的无密码身份验证,直到用户“注销”。

基本上我正在寻找的是firebase JavaScript SDK's“身份验证状态持久性”功能。不幸的是,Node.js 不支持该功能;使用'local''session' 调用setPersistence,因为模式会引发错误“当前环境不支持指定的持久性类型。”

“我自己”实现该功能的最简单方法是什么?

我研究了 SDK 如何将用户持久保存在浏览器中,基本上它将用户对象字符串化并将其存储在本地存储中。我可以在 Node.js 中轻松地自己对用户对象进行字符串化(该实例有一个 toJSON 方法),但我不知道如何稍后将字符串反序列化为 firebase.User 的实例。我看到this function in the source code 看起来可以解决问题。但这并没有在 SDK AFAIK 上对外公开。

【问题讨论】:

  • 命令行界面 (CLI) 位于机器本地。 CLI 通常称为终端。因此,命令行不适用于最终用户 - 它适用于管理员。对吗?
  • @RonRoyston 这是一个供最终用户使用的 CLI,而不是管理员。我想实现的功能类似于npm login,如果你曾经使用过的话。

标签: node.js firebase firebase-authentication


【解决方案1】:

您可以从序列化的用户对象实例化firebase.User 类:

保存用户

const userJson = JSON.stringify(currentUser.toJSON())
// Write userJson to disk

加载用户

// Read userJson from disk
const userData = JSON.parse(userJson)
const user = new firebase.User(userData, userData.stsTokenManager, userData)
firebase.auth().updateCurrentUser(user)

来源:https://github.com/firebase/firebase-js-sdk/issues/1874#issuecomment-549085119

【讨论】:

    【解决方案2】:

    在需要令牌的 CLI 应用程序中,这些令牌通常存储在本地机器上的某个位置(通常在 Linux 机器的主目录中的“点”文件中 - 例如~/.yourapp/config

    这些文件可以是你想要的任何格式,但我喜欢 JSON 或 YAML 来存储这样的东西。

    就用户对象而言,您可以使用 Node.js 内置 JSON.parse(yourStringUser) 轻松加载字符串。

    firebase-js-sdk source code 中,您可以找到使用会话存储执行类似操作的参考;使用toJSON() 方法设置某个key 并使用JSON.parse() 方法检索该值。

    【讨论】:

    • 感谢您的回复。我能够将序列化的用户保存到用户的主目录中。在序列化的用户上调用 JSON.parse 是不够的,因为这会创建一个“普通的”JavaScript 对象,而我需要创建一个 firebase.User 类的实例,其中包含用于刷新令牌等的所有花哨的方法。
    【解决方案3】:

    Session management with service workers

    最终用户将在本地安装 Node.js - 并且您想要构建一个 interactive Node script/app,这需要客户端/令牌访问 Firebase。

    Firebase 身份验证提供使用服务工作线程检测的能力 并传递 Firebase ID 令牌以进行会话管理。

    如果您查看 Firebase CLI 本身的工作原理,用户会通过网络浏览器登录,然后将身份验证代码粘贴到 Firebase CLI (firebase login --no localhost)。然后,用户登录。因此,使用浏览器和 Firebase Web SDK 来收集凭据。

    【讨论】:

    • 感谢您的回复!我使用了firebase CLI(firebase-tools npm 包),它使用浏览器作为其login 工作流程的一部分。这非常漂亮,但是将浏览器带入图片只会使问题复杂化。浏览器的 Web 存储不容易从 Node.js 上下文访问。 firebase login 工作流通过特殊措施在 Node.js 和浏览器之间进行通信。 (它启动一个网络服务器并打开用户的浏览器窗口)。我需要知道要在文件系统上保留什么以及以后如何解组它。
    • 也许可以看到Authenticate with Firebase in JavaScript Using a Custom Authentication System。不过,这是 Web SDK 的一个特性。 ...身份验证可能是一个实时接收器,所以我会说在决定定制之前三思而后行。
    【解决方案4】:

    我在 Google Cloud Platform 支持下对此进行了详尽的探索,我们确定当前的 SDK 无法做到这一点。 FWIW,这个功能只花了我几个小时就用 AWS Cognito 实现了。 the CognitoUser constructor 允许用户传递他们最喜欢的 Node.js 实现的 localStorage API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多