如何使用Firebaselogin多个社交服务?
我希望用户能够使用多个不同的身份validation提供程序(例如Facebook,Twitter或Github)对我的Firebase应用程序进行身份validation。 一旦通过身份validation,我希望用户可以访问同一个帐户,无论他们使用哪种身份validation方法。
换句话说,我想在应用程序中将多个auth方法合并到一个帐户中。 如何在Firebase应用中执行此操作?
更新 (20160521): Firebase刚刚发布了其Firebase身份validation产品的重大更新,该产品现在允许单个用户链接来自各个支持提供商的帐户。 要了解有关此function的更多信息,请阅读iOS , Web和Android的文档。 下面的答案是由于历史原因。
核心Firebase服务提供了多种身份validation方法: https : //www.firebase.com/docs/security/authentication.html
Firebase的核心是使用安全的JWT令牌进行身份validation。 任何导致生成JWT令牌(例如在您自己的服务器上使用JWT库)的任何操作都会将您的用户authentication为Firebase,因此您可以完全控制authentication过程。
Firebase提供称为Firebase简单login的服务,这是生成这些令牌的一种方式(这提供了我们的Facebook,Twitter等身份validation)。 它适用于常见的身份validationscheme,因此您可以在没有服务器的情况下快速启动并运行,但这不是唯一的身份validation方法,也不是一个全面的解决scheme。
以下是一个允许使用Firebase简单login的多个提供者login的方法:
- 为每个用户存储一个规范的用户标识符,并为每个特定于提供者的标识符映射一个规范的标识符。
- 更新您的安全规则以匹配给定用户帐户上的任何凭据,而不仅仅是一个。
在实践中,安全规则可能看起来像这样,假设你想同时启用Twitter和Facebook身份validation(或允许用户创build一个帐户,然后添加另一个):
{ "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)" } } } }
在本例中,您存储了一个全局用户标识(可以是您select的任何东西),并维护Facebook,Twitter等身份validation机制到主要用户logging的映射。 在为每个用户login后,您将从用户映射中获取主要用户logging,并将该用户ID用作用户数据和操作的主要存储。 上面还限制和validation了用户映射中的数据,以便它只能由已经具有相同的Facebook,Twitter等的用户ID写入到/ users / $ userid /(facebook-id | twitter -id |等-ID)。
这个方法可以让你快速启动并运行。 但是, 如果您有一个复杂的用例,并且想要完全控制auth体验,则可以在自己的服务器上运行自己的auth代码 。 有许多有用的开源库可以用来做到这一点,比如everyauth和护照 。
您也可以使用第三方身份validation提供程序进行身份validation。 例如,您可以使用Singly ,它具有各种各样的开箱即用function,无需编写任何服务器端代码。
我知道这个post存在好几个月,但是当我遇到这个问题时,我花了很多时间让代码更加灵活。 基于上面的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,Twitterlogin时查找的第一个信息…. userMappings的用户将指向用户的主要帐户。 所以通过Facebook或Twitterlogin后,我们可以查找主要的用户帐户。 在用户中,我们保留了可以访问其数据的userMapping列表。
创build新用户时,我们必须先在用户中创build一个帐户。 用户中用户的id可以是我们想要的任何东西。 这是灵活的,因为我们可以提供更多的login方法,如谷歌,Github,而无需添加更多的安全规则。
我刚刚创build了一个angularfire装饰器来处理这个: angularfire-multi-auth
我花了相当长的时间思考一个很好的解决scheme,恕我直言,能够从任何提供商注册只是混乱。 在我的前端,我总是要求一个电子邮件注册,所以用facebook和google +logging的用户,当他通知他的电子邮件时,将被logging为同一个用户。
这样,由Kuma提出的样本数据就不需要复制userMappings。
示例数据存储:
userMappings |---facebook:777 | |---user:"123" |---twitter:888 |---user:"123" users |---123 |---user data