如何使用 Firebase 登录多个社交服务?

2023-12-30

我希望用户能够使用多个不同的身份验证提供商(例如 Facebook、Twitter 或 Github)对我的 Firebase 应用程序进行身份验证。经过身份验证后,我希望用户无论使用哪种身份验证方法都可以访问同一帐户。

换句话说,我想将多个身份验证方法合并到我的应用程序中的单个帐户中。如何在 Firebase 应用中执行此操作?



Update(20160521):Firebase 刚刚发布了重大更新Firebase 身份验证 https://firebase.google.com/docs/auth/产品,现在允许单个用户链接来自各个支持的提供商的帐户。要了解有关此功能的更多信息,请阅读以下文档:iOS https://firebase.google.com/docs/auth/ios/account-linking, Web https://firebase.google.com/docs/auth/web/account-linking and Android https://firebase.google.com/docs/auth/android/account-linking。由于历史原因,留下下面的答案。


Firebase 核心服务提供了多种身份验证方法:https://www.firebase.com/docs/security/authentication.html https://www.firebase.com/docs/security/authentication.html

Firebase 的核心使用安全 JWT 令牌进行身份验证。任何导致生成 JWT 令牌的操作(例如在您自己的服务器上使用 JWT 库)都将有助于向 Firebase 对您的用户进行身份验证,因此您可以完全控制身份验证过程。

Firebase 提供了一项名为 Firebase Simple Login 的服务,这是生成这些令牌的一种方法(这提供了我们的 Facebook、Twitter 等身份验证)。它适用于常见的身份验证方案,以便您可以在没有服务器的情况下快速启动并运行,但它不是唯一的身份验证方法,也不是一个全面的解决方案。

以下是允许使用 Firebase Simple Login 登录多个提供商的一种方法:

  1. 为每个用户存储一个规范的用户标识符,以及一个映射 每个特定于提供商的标识符对应一个规范 ID。
  2. 更新您的安全规则以匹配上的任何凭据 给定用户帐户,而不仅仅是一个。

实际上,安全规则可能如下所示,假设您想要同时启用 Twitter 和 Facebook 身份验证(或允许用户使用其中之一创建帐户,然后添加另一个帐户):

{
  "users": {
    "$userid": {
      // Require the user to be logged in, and make sure their current credentials
      // match at least one of the credentials listed below, unless we're creating
      // a new account from scratch.
      ".write": "auth != null && 
        (data.val() === null || 
        (auth.provider === 'facebook' && auth.id === data.child('facebook/id').val() || 
        (auth.provider === 'twitter' && auth.id === data.child('twitter/id').val()))"
    }
  },
  "user-mappings": {
    // Only allow users to read the user id mapping for their own account.
    "facebook": {
      "$fbuid": {
        ".read": "auth != null && auth.provider === 'facebook' && auth.id === $fbuid",
        ".write": "auth != null && 
          (data.val() == null || 
          root.child('users').child(data.val()).child('facebook-id').val() == auth.id)"
      }
    },
    "twitter": {
      "$twuid": {
        ".read": "auth != null && auth.provider === 'twitter' && auth.id === $twuid",
        ".write": "auth != null && 
          (data.val() == null || 
          root.child('users').child(data.val()).child('twitter-id').val() == auth.id)"
      }
    }
  }
}

在此示例中,您存储一个全局用户 ID(可以是您选择的任何内容)并维护 Facebook、Twitter 等身份验证机制与主要用户记录之间的映射。每个用户登录后,您将从用户映射中获取主要用户记录,并使用该 ID 作为用户数据和操作的主要存储。上面还限制和验证了用户映射中的数据,以便只能由在 /users/$userid/(facebook-id|twitter 下已经拥有相同 Facebook、Twitter 等用户 id 的正确用户写入数据-id|etc-id)。

这种方法可以让您快速启动并运行。然而,如果您有复杂的用例并希望完全控制身份验证体验,您可以在自己的服务器上运行自己的身份验证代码。您可以使用许多有用的开源库来执行此操作,例如凡奥特 https://github.com/bnoguchi/everyauth and passport http://passportjs.org.

您还可以使用第三方身份验证提供商进行身份验证。例如,您可以使用Singly https://singly.com/docs/firebase,它具有大量开箱即用的集成,无需您编写任何服务器端代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Firebase 登录多个社交服务? 的相关文章

随机推荐

  • constexpr 的函数参数等效项是什么?

    我们正在尝试加速 Clang 和 Visual C 下的一些代码 GCC 和 ICC 也可以 我们thought我们可以使用constexpr告诉 Clang 一个值是一个编译时常量 但它会导致编译错误 clang g2 O3 std c
  • Node.js:什么是 ENOSPC 错误以及如何解决?

    我在使用 Node js 并将文件上传到服务器时遇到问题 为了将文件上传到服务器 我使用这个plugin https github com Valums File Uploader file uploader 当开始将文件上传到服务器时 N
  • 比较两个复杂对象的最佳方法

    我有两个复杂的对象 例如Object1 and Object2 它们有大约 5 个级别的子对象 我需要最快的方法来判断它们是否相同 在 C 4 0 中如何做到这一点 实施IEquatable
  • 禁用自动更改检测可能会在 EF 中导致哪些错误?

    我最近通过禁用自动更改检测来调整运行速度非常慢的应用程序的一部分 Context Configuration AutoDetectChangesEnabled false 在执行批量删除之前 然后重新启用它并保存更改 我读了几个不同的来源解
  • CSS 浮动 - IE6 中的内容掉落

    我的布局左侧有一个菜单 DIV 它以固定的 EM 宽度向左浮动 然后我有一个内容 DIV 其左边距大于菜单的宽度 因此它很好地位于菜单右侧 并用菜单和内容完美排列来填充剩余空间 然而 在 Internet Explorer 6 中 如果内容
  • 如何部署具有不同参数的 Azure 函数的多个副本

    我当前正在运行一个 Azure 函数 定期从 REST API 提取数据并将数据复制到一组文件 它工作正常 但目前的架构是迭代 100 个不同的参数 理想情况下 负载是独立的 有没有办法多次部署 Azure 函数 并为每个实例使用不同的静态
  • RefactoringTool:ParseError:错误输入:类型= 22,值='='

    我正在重构一些 python2 代码并使用 2to3 模块将其更改为 python3 我收到以下解析错误 RefactoringTool There was 1 error RefactoringTool Can t parse helpe
  • 单击按钮后,在单击事件正在进行时在按钮上显示微调器图标

    我试图在提交时加载时在按钮上显示微调器 我已经看到了几个实现并在我的应用程序中进行了尝试 但它不起作用 这里是fiddle http jsfiddle net q1d06npq 5 我正在尝试描述这一点 我想提一下另一件事 这个 HTML
  • Flex:DataGrid 数字列格式

    我正在尝试格式化 DataGrid 列中的一些数字 当我运行下面的简化测试程序时 出现错误 到目前为止我看到的所有示例都有字符串的列数据 有没有办法用数字来做到这一点 如何修改下面的代码以格式化checking价值观
  • 设置与主题样式不同的本地隐式样式/替代 BasedOn DynamicResource

    想象一个 wpf 应用程序 我可以在其中动态更改主题 我通过在应用程序资源级别替换 ResourceDictionaries 来实现此目的 主题资源字典具有为 TextBox 等定义的隐式样式 现在 我的应用程序中有一部分文本框应该具有这种
  • Unity框架DependencyAttribute仅适用于公共属性?

    我试图清理代码中的一些可访问性内容 无意中破坏了 Unity 依赖注入 一段时间后 我意识到我标记了一些我并不真正希望在 DLL 外部暴露给内部的公共属性 然后我开始遇到异常 所以看来在Unity中使用 Dependency 属性只适用于公
  • Jackson 序列化忽略时区

    我使用下面的代码来序列化从外部服务获取的响应 并返回 json 响应作为我的服务的一部分 但是 当外部服务返回时间值和时区 10 30 00 000 05 00 时 杰克逊会将其转换为 15 30 00 如何忽略时区值 public int
  • 使用 jQuery 单击后禁用链接

    我有许多链接 A 元素 样式为 btn 类的按钮 当单击其中之一时 我希望禁用该特定按钮 这段代码不起作用 btn on click function e this prop disabled true 有大量的教程用于防止表单提交按钮的默
  • 不使用 Newtonsoft json 而是使用 System.Web.Script.Serialization.JavaScriptSerializer 反序列化具有不同数据类型的 json 字段

    我在反序列化 json 数据时遇到问题 该数据可以同时具有浮点或数组类型的数据 同样的问题来自这里在 C 中处理包含不同类型的 JSON 字段 https stackoverflow com questions 27131664 deali
  • 如何提高 teamcity 构建性能?

    我的项目有以下步骤 build 单元测试 测试覆盖率 重复项查找器 fx cop 有没有办法让TeamCity并行执行2 5个步骤 我可以为此使用多个构建代理吗 是的 假设您至少有四个构建代理 您可以执行以下操作 Under MyProje
  • Azure 逻辑应用 - 从 URL 下载文件

    我在逻辑应用程序中有一个要求 我需要从网站 URL 执行 HTTP GET 该网站 URL 提供了我需要下载到 Azure 文件存储的文件 我可以调用可下载 URL 但不确定如何将文件下载到 Azure 文件存储目录 请让我知道您的输入 我
  • WPF 组合框数据绑定所选项目

    我正在尝试数据绑定ComboBox到一个列表strings 到目前为止 我已经得到以下内容 在我看来 我有
  • 使用 Douglas Crockford 的函数继承在 Javascript 中调用基本方法

    基本上如何使用下面的模式调用基本方法 var GS GS baseClass function somedata var that that data somedata Base class method that someMethod f
  • 适合初学者的 Java 编程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 Firebase 登录多个社交服务?

    我希望用户能够使用多个不同的身份验证提供商 例如 Facebook Twitter 或 Github 对我的 Firebase 应用程序进行身份验证 经过身份验证后 我希望用户无论使用哪种身份验证方法都可以访问同一帐户 换句话说 我想将多个