【问题标题】:How to store access tokens in Firebase back-end?如何在 Firebase 后端存储访问令牌?
【发布时间】:2020-09-16 17:26:06
【问题描述】:

我的 React 应用使用 Firebase 身份验证和实时数据库。我现在需要使用 OAuth 2.0 访问 3rd 方服务。为了安全地执行此操作,我使用带有 Firebase 功能的 OAuth 2.0 授权代码流作为我的后端:

  1. React 应用从第 3 方获取授权码。
  2. 授权代码被传递给 Firebase 函数以获取访问令牌。

但这就是我卡住的地方。如何将访问令牌保存在后端,以便 React 应用程序可以访问 3rd 方资源?我不想将访问令牌存储在 React 应用中,因为这不安全。

  1. 如何使用 Firebase 函数在后端维护会话?
  2. 会话应该绑定到 React 应用实例还是 Firebase 用户?前一种方法需要进行会话清理。后者的优点是可以使用刷新令牌获得新的访问令牌。这样用户就不必再次登录到第 3 方了!

【问题讨论】:

    标签: firebase oauth-2.0 google-cloud-functions


    【解决方案1】:

    在尝试了多种不同的方法之后,我最终将访问令牌和刷新令牌存储在后端,两者都与 firebase 用户相关联。令牌只能通过 firebase 函数访问。这种方法具有以下优点:

    1. 安全
    2. 我不必担心会话和会话清理。
    3. 我可以随时使用刷新令牌刷新访问令牌。

    【讨论】:

      【解决方案2】:

      总体因素

      通常这些是您的 SPA 安全选择会影响的领域,并且需要权衡取舍:

      • 应用类型
      • 强大的安全性
      • 托管和全球性能
      • 技术简单

      在所有情况下

      您的应用应该:

      • 分别为每个用户维护一个令牌
      • 您需要在登录后通过令牌识别用户

      选项 1:前端模型/无饼干

      这涉及在浏览器中使用令牌并具有以下好处:

      • 后端仅是静态内容
      • 可以通过 CDN 将 Web 资源部署在靠近用户的位置
      • 您可以使用OIDC Client library 来管理安全性

      这被广泛使用,并且只有在您的应用存在跨站点脚本漏洞时才能被利用。我的一些资源:

      选项 2:后端模型 / AUTH COOKIES

      这涉及通过后端进行代理并在身份验证 cookie 中携带令牌。如果开发在线银行应用程序,我会使用此模型,但对于中等安全性应用程序,它会增加很多开销。您可能需要编写更多的安全代码,最终得到的解决方案可能比选项 1 更不安全:

      • 需要运行代码的代理后端
      • 后端代码可能需要集群化和全局分布,以实现良好的性能
      • 您需要保护 auth cookie 并应对跨站请求伪造风险

      出于兴趣,受人尊敬的 mod_auth_openidc 库可能对此类解决方案有所帮助。

      两全其美

      如果在浏览器中使用令牌被认为是不可接受的,我会尽可能遵循选项 1。然后将选项 2 作为附加步骤实现:

      • 将 Web 静态内容单独部署到执行后端令牌管理的代码
      • 继续使用 OIDC 客户端库,让授权码交换调用您的后端
      • 与选项 1 的唯一区别是令牌对浏览器代码不可用

      【讨论】:

      • 嗨,加里,非常感谢您的回复和撰写。我一定会经历的。目前,我已经成功实现了访问令牌的基于前端的内存存储。但是,我在多个地方读到过在前端存储令牌是不安全的(这里是one example。这就是我想尝试后端模型的原因。
      • 非常有趣的谈话 Naresh,你提出了一些好观点。我已经更新了我上面的原始答案,在托管、性能和库的使用方面增加了一些要点。
      • 加里,再次感谢您详细说明您的答案。在权衡了所有选项后,我选择将令牌存储在后端。主要原因是我已经使用后端作为代理来访问 OAuth 资源(目标资源服务器无论如何都不允许我从前端访问它们——它们给出了 CORS 错误)。因此,将令牌保存在后端只是一个小的增量工作。
      猜你喜欢
      • 2018-02-19
      • 2013-07-11
      • 2021-04-07
      • 1970-01-01
      • 2019-11-16
      • 2012-07-18
      • 2021-10-29
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多