具有多个社交登录/注册数据库结构的统一用户帐户

Tar*_*aly 6 php mysql database facebook-graph-api facebook-login

我正在创建一个网站,用户可以在其中通过 facebook、twitter、linkedin、google plus 和常规表单流程登录/注册。

到目前为止,我这个过程的数据库结构是

**users_table** 
id - username - password_hash - email - auth_key -date_created - last_login 

**user_profile**
id - user_id (foreign_key) - first_name - last_name - gender - phone - photo

**facebook_users**
id - facebook_id - profile_link - user_id (foreign_key)

**linkedin_users**
id - linkedin_id - profile_link - user_id (foreign_key)

**have_social_account**
facebook(tinyint)[0-1] - twitter(tinyint)[0-1] - linkedin(tinyint)[0-1] - google(tinyint)[0-1]
Run Code Online (Sandbox Code Playgroud)

现在,当用户使用他的 facebook 登录时,例如我在用户表和 user_profile 上为他创建了一个带有附加信息的新记录,然后我将身份验证密钥和个人资料链接插入到 facebook_users 中(因为它是一个 facebook 登录),最后我插入一个facebook 下 have_social_account 中的新记录,值为 (1)。

但如果同一用户尝试使用他的linkedin 帐户登录;将使用新的 user_id 创建一条新记录,这就是我无法统一此用户帐户的原因。如果电子邮件相同,我可以处理它,但是如果用户为每个社交帐户使用不同的电子邮件地址怎么办。

任何人都可以帮助我制定此过程的最佳结构吗?提前致谢

Jef*_*ert 5

如果用户在您的不同身份验证提供程序中使用不同的电子邮件地址,我认为您无能为力。你需要一些你可以依赖的东西,所有主要参与者都能够提供给你的独一无二的东西,恕我直言,电子邮件是最好的。

话虽如此,我认为您不需要这么多桌子。您的usersuser_profiles表很好,但除此之外,为什么不只使用一个表来存储不同的提供者帐户?

provider_accounts
-----------------
    id
    user_id
    type (enum of 'Facebook', 'Linked In')
    profile_link
Run Code Online (Sandbox Code Playgroud)

使用此结构,您可以轻松获取单个用户的所有提供商帐户,并确定给定电子邮件是否已具有给定提供商类型的特定帐户。

如果用户请求或以其他方式确定这两个帐户实际上是同一用户,您可以通过使用某种实用程序将两个帐户“合并”在一起来潜在地缓解这种情况。