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

     2023-02-22     135

关键词:

【中文标题】如何使用 Firebase 登录多个社交服务?【英文标题】:How can I login with multiple social services with Firebase? 【发布时间】:2013-02-15 09:14:22 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

更新 (20160521):Firebase 刚刚发布了对其Firebase Authentication 产品的重大更新,现在允许单个用户链接来自各种受支持提供商的帐户。要了解有关此功能的更多信息,请阅读 iOS、Web 和 Android 的文档。由于历史原因,下面的答案是留下的。


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

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

Firebase 提供了一种称为 Firebase 简单登录的服务,它是生成这些令牌的一种方式(这提供了我们的 Facebook、Twitter 等身份验证)。它适用于常见的身份验证场景,这样您就可以在没有服务器的情况下快速启动和运行,但它不是唯一的身份验证方式,也不是一个全面的解决方案。

这是允许使用 Firebase 简单登录与多个提供商一起登录的一种方法:

    为每个用户存储一个规范的用户标识符,并为每个用户存储一个映射 该规范 id 的每个提供商特定标识符。 更新您的安全规则以匹配 给定的用户帐户,而不仅仅是一个。

在实践中,安全规则可能如下所示,假设您希望同时启用 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 -id|etc-id)。

这种方法可以让您快速启动并运行。但是,如果您有一个复杂的用例并希望完全控制身份验证体验,您可以在自己的服务器上运行自己的身份验证代码。您可以使用许多有用的开源库来执行此操作,例如 everyauth 和 passport。

您还可以使用第 3 方身份验证提供程序进行身份验证。例如,您可以使用 Singly,它具有多种开箱即用的集成,无需您编写任何服务器端代码。

【讨论】:

我有几个关于此策略的问题:***.com/questions/22886053/… 我看不出.child('twitter/id').val().child('twitter-id').val() 之间的区别。两者是不同的参考吗?我没听懂。 非常感谢映射示例。是否可以跟进一些关于如何在 iOS 上执行此操作的代码? 我在生产应用程序上使用了一个非常相似的系统有一段时间了。我的数据结构有点不同。在用户映射下,我只有一个 UID 列表。我还没有找到任何理由将它们分成提供者存储桶......尽管每个节点最终都会被标记为提供者名称。这种稍微浅一点的数据结构允许您对所有用户映射运行查询,因此您可以快速关联使用不同方法但使用相同电子邮件地址登录的用户。以下是一些文档:christopheresplin.com/post/124334674865/… 这可能是一个很好的解决方案,但从来没有网络向用户提供电子邮件,也从来没有用户允许阅读他们的电子邮件......如果不是电子邮件来“关联”,那么什么可以是“粘合剂”?两个用户或用户映射?【参考方案2】:

我知道这篇文章已经存在好几个月了,但是当我遇到这个问题时,我花了很多时间来使代码更灵活。根据上面的 Andrew 代码,我稍微调整了一下代码。

示例数据存储:

userMappings
|---facebook:777
|   |---user:"123"
|---twitter:888
    |---user:"123"
users
|---123
    |---userMappings
        |---facebook: "facebook:777"
        |---twitter: "twitter:888"

安全规则:

"userMappings": 
  "$login_id": 
    ".read": "$login_id === auth.uid",
    ".write": "auth!== null && (data.val() === null || $login_id === auth.uid)"
  
,

"users": 
  "$user_id": 
    ".read": "data.child('userMappings/'+auth.provider).val()===auth.uid",
    ".write": "auth!= null && (data.val() === null || data.child('userMappings/'+auth.provider).val()===auth.uid)"
  

所以 userMappings 仍然是我们通过 Facebook、Twitter 登录时首先查找的信息.... userMappings 的 user 将指向 用户。因此,通过 Facebook 或 Twitter 登录后,我们可以查找主用户帐户。在 users 中,我们保留了可以访问其数据的 userMapping 列表。

创建新用户时,我们必须先在users中创建一个帐户。 users 中用户的 id 可以是我们想要的任何东西。这很灵活,因为我们可以提供更多的登录方式,如谷歌、Github,而无需添加更多的安全规则。

【讨论】:

这似乎是一个很好的解决方案,但它让我想知道/在一个方面被阻止:具有正确 auth.uid 的请求将能够访问它需要的“userMapping”,自然(检查!) ,并且还可以通过查找其“userMappings”子级来访问它需要的“用户”(有点笨拙,但请检查!)。但是当我们有其他数据/字段时,比如说“userActivity”或“userPosts”,如何使这些字段只能由创建它们的用户写入?似乎他们还必须有一个“userMappings”子级,其中包含该用户的所有登录密钥.. @MathewHuuskoV:我认为在“userActivity”或“userPosts”中,我们可以通过使用预定义变量“root”在 userMappings 中查找用户 ID 来检查安全规则。例如。 “.write”:“root.child('userMappings/'+auth.uid).child('user').val()===data.child('author').val()”。其中“作者”包含帖子作者的用户 ID。 有人已经实现了这样的东西吗?这种解决方案是否有任何代码示例?我想使用电子邮件/密码或 Facebook 将 Firebase 登录添加到同一个帐户到我的 iOS 应用程序。我看到几个场景使整个事情变得相当复杂,这取决于用户如何登录,以及用户之前是否使用电子邮件或 Facebook 创建了帐户。例如,如果用户使用 Facebook 登录,但之前只使用电子邮件/密码登录,我应该如何在我的 Firebase 数据库中找到匹配的用户?反之亦然。【参考方案3】:

我刚刚创建了一个 angularfire 装饰器来为我们处理这个问题:angularfire-multi-auth

【讨论】:

【参考方案4】:

我花了很多时间思考一个好的解决方案,恕我直言,能够从任何提供商处注册只是令人困惑。在我的前端,我总是要求进行电子邮件注册,例如,使用 facebook 和 google+ 登录的用户在通知他的电子邮件时会以同一用户的身份登录。

这样,Kuma 提出的 Sample Data 就不需要复制 userMappings。

示例数据存储:

userMappings
|---facebook:777
|   |---user:"123"
|---twitter:888
    |---user:"123"
users
|---123
    |---user data

【讨论】:

如何使用 Firebase 进行“使用 Spotify 登录”身份验证系统?

】如何使用Firebase进行“使用Spotify登录”身份验证系统?【英文标题】:Howtomakea\'loginwithSpotify\'authenticationsystemusingFirebase?【发布时间】:2016-08-2814:29:19【问题描述】:我有一个网页,我想让它仅在用户使用他们的Spotify帐户登录... 查看详情

如何使用 OAuth2 和社交登录保护 Spring Boot RESTful 服务

】如何使用OAuth2和社交登录保护SpringBootRESTful服务【英文标题】:howtoSecureSpringBootRESTfulservicewithOAuth2andSociallogin【发布时间】:2017-01-2410:27:59【问题描述】:我正在尝试使用Angular2前端应用程序作为客户端,它将使用来自SpringRESTfu... 查看详情

如何使用 django-rest-framework 进行社交登录? [关闭]

】如何使用django-rest-framework进行社交登录?[关闭]【英文标题】:Howexactlyworkasocialloginwithdjango-rest-framework?[closed]【发布时间】:2015-11-2916:50:57【问题描述】:我需要创建一个Web服务来登录用户。此Web服务将从Android或iOS应用程序调... 查看详情

Firebase Auth 与新的 Apple 选择退出社交登录

】FirebaseAuth与新的Apple选择退出社交登录【英文标题】:FirebaseAuthwithnewApple\'sopt-outfromsociallogin【发布时间】:2018-07-2019:38:41【问题描述】:新的Apple指南规定用户应该能够选择退出社交登录并切换到电子邮件登录。通过Facebook和Tw... 查看详情

firebase 社交登录不适用于我的 android 设备,仅适用于网络

】firebase社交登录不适用于我的android设备,仅适用于网络【英文标题】:firebasesociallogindoesn\'tworkwithmyandroiddevice,,worksonlyonweb【发布时间】:2017-01-2616:05:49【问题描述】:firebase社交登录(Facebook&gmail)不适用于我的Android设备单击... 查看详情

如何将多个身份验证提供程序链接到 Firebase 帐户?

】如何将多个身份验证提供程序链接到Firebase帐户?【英文标题】:HowtoLinkMultipleAuthProviderstoanFirebaseAccount?【发布时间】:2016-10-1214:51:46【问题描述】:我无法成功,我按照Firebase文档中的说明执行了以下步骤:使用现有的身份验... 查看详情

在 Lock 中使用社交提供者登录时如何强制选择帐户

】在Lock中使用社交提供者登录时如何强制选择帐户【英文标题】:HowtoforceaccountselectionwhenusingsocialproviderlogininLock【发布时间】:2017-02-2410:29:23【问题描述】:我在使用社交服务提供商时无法清除上次登录。当前使用带有以下选... 查看详情

如何使用firebase快速将自定义登录(电子邮件)与Facebook登录合并

】如何使用firebase快速将自定义登录(电子邮件)与Facebook登录合并【英文标题】:Howtomergecustomlogin(Email)withFacebooklogininswiftusingfirebase【发布时间】:2017-05-1805:42:26【问题描述】:我正在使用Firebase快速实现自定义(电子邮件)和F... 查看详情

flutter firebase auth 可以处理具有相同电子邮件 ID 的多个社交媒体帐户吗?

】flutterfirebaseauth可以处理具有相同电子邮件ID的多个社交媒体帐户吗?【英文标题】:Canflutterfirebaseauthtacklemultiplesocialmediaaccountswithsameemailid?【发布时间】:2020-08-0716:25:56【问题描述】:firebase身份验证是否有助于解决相同的电... 查看详情

如何保持 Firebase 登录?

】如何保持Firebase登录?【英文标题】:HowtopersistaFirebaselogin?【发布时间】:2017-08-1005:32:01【问题描述】:我正在使用IonicFramework和Firebase制作应用程序。我进行了自定义登录以在Firebase中获取数据,但每次重新启动应用程序时,... 查看详情

如何在firebase firestore中准确合并多个流

】如何在firebasefirestore中准确合并多个流【英文标题】:Howexactlytomergemultiplestreamsinfirebasefirestore【发布时间】:2020-12-0913:51:04【问题描述】:在你说这是一个重复的问题或者我应该使用嵌套流构建器之前,请听我说完。我正在设... 查看详情

ershoumall使用gitee社交登录(注意@requestbody不可有多个)(代码片段)

社交登录使用oauth2技术。需要解决的问题一:在社交登录授权登录后,该gitee、weibo用户需要关联本ershoumall系统的会员账户信息ershoumall-member,故需远程调用oauth2login方法。由于我在远程调用方法中声明了两个实体类&#x... 查看详情

flutter firebase google登录以及如何从多个类访问

】flutterfirebasegoogle登录以及如何从多个类访问【英文标题】:flutterfirebasegooglesigninandhowtoaccessfrommultipleclasses【发布时间】:2019-04-2612:30:12【问题描述】:我有一个有效的谷歌登录和退出从教程中学习但我不知道如何从另一个类访... 查看详情

如何使用 Apollo Server 进行社交登录?

】如何使用ApolloServer进行社交登录?【英文标题】:HowtoSocialLoginwithApolloServer?【发布时间】:2021-08-1822:58:36【问题描述】:这次我想为后端使用不同的技术。所以我选择了prisma、apollo-server和typegraphql作为我的graphqlAPI。youcanfindmore... 查看详情

用于颤振的 Facebook 社交登录

...间】:2019-10-2902:41:15【问题描述】:我正在尝试通过使用Firebase实现Facebook社交登录,我想我几乎完成了它,但不知何故,控制台告诉我用户出于某种原因正在取消。有一点,代码不起作用并打印出Facebook登录失败,但我将acebookLo... 查看详情

Firebase 身份验证服务

】Firebase身份验证服务【英文标题】:FirebaseAuthenticationService【发布时间】:2019-02-0611:21:01【问题描述】:我想设置多个认证服务。好像用户使用电子邮件和密码或电话号码登录,但我希望用户同时使用电子邮件和密码以及电话... 查看详情

使用testcafé,如何同时登录多个服务?

】使用testcafé,如何同时登录多个服务?【英文标题】:usingtestcafé,howtobeloggedintomultipleservicesthesametime?【发布时间】:2020-11-1117:43:07【问题描述】:我正在尝试通过testcafé的role-mechanism/concept使用testcafé登录多个服务。我的测试... 查看详情

如何使用 Firebase 云存储添加图像存储功能?

】如何使用Firebase云存储添加图像存储功能?【英文标题】:HowtoaddimagestoringfeatureusingFirebaseCloudstore?【发布时间】:2022-01-1117:23:18【问题描述】:我正在使用firebase构建一个笔记应用程序。用户可以登录和保存笔记的地方。我想... 查看详情