如何将社交登录集成到现有的用户架构/登录系统?

Lux*_*ode 6 authentication database-design login oauth single-sign-on

我有一个RESTful API,多个客户端连接到(Web,iOS和Android应用程序).目前,用户只能使用用户名和密码创建帐户(电子邮件是可选的),并且它们在数据库中仅使用这些列表示.

用户通过POST登录到/ session端点,通过我们的"登录".API响应是一个新的秘密令牌(我们将其与用户名相关联).客户端使用此令牌对客户端发起的所有POST请求进行签名,我们的API稍后将使用该请求对请求进行身份验证.

但是,我们现在希望允许社交登录(Google+,FB,Twitter).我们的用户也希望使用社交登录以方便使用,但他们希望他们选择自己的随机用户名以显示在他们的评论旁边等.

我的问题:为了支持社交登录,我需要对API进行哪些更改?我是否需要对我的数据库模式进行重大更改以支持此操作,如果是,那究竟是什么?此外,服务器是否需要了解社交登录提供商授予的访问令牌的任何信息?

请注意,此功能的范围不包括将多个社交登录帐户与同一个人关联的功能.我想让事情变得尽可能简单.

一般对如何正确实现这一点感到困惑.我更喜欢让事情尽可能简单,以便为简单的解决方案增加额外的分数.任何建议将不胜感激.

Pir*_*App 5

  • 我有完全相同的问题
  • 我需要 Facebook Twitter Google 和 GitHub 登录
  • 让我们看看这是如何工作的
  • 我有 2 个表,一个 users 表和一个 Social_tokens 表
  • 我的用户表看起来像这样

用户(user_id 整数、昵称 varchar(64)、电子邮件 varchar(255)、密码 varchar(64)、email_verified 布尔值、启用布尔值、created_at timestamptz、updated_at timestamptz)

  • 这里需要注意的是,user_id是主键,昵称是唯一的,电子邮件是唯一的,email_verified的默认值为FALSE,enabled的默认值为TRUE,密码是可选的,这要归功于社交登录

  • 我的social_tokens表看起来像这样

Social_tokens(provider_user_id varchar(255),provider_type enum('facebook','twitter','google','github'),user_id整数,access_token varchar(255),refresh_token varchar(255),过期timestamptz,created_at timestamptz,udpated_at时间戳)

  • provider_user_id 是社交网络分配给每个用户的唯一 ID
  • 在我的例子中,provider_type 是一个有 4 个值的枚举:facebook、twitter、google 和 github
  • user_id 引用用户表中的 user_id
  • access_token和refresh_token(如果提供)只是提供者分配的令牌
  • 谷歌似乎有过期的概念,所以我也添加了一个过期列,其余的都是可选的
  • PRIMARY KEY 是 (provider_user_id、provider_type、user_id) 的组合,因为单个用户可能有多个社交登录名,因此 user_id 不能作为主键
  • 虽然可以说,provider_user_id 对于给定社交网络中的每个用户来说都是唯一的,但不同的社交网络又如何呢?因此组合

  • 这个想法是每个用户可能有多个社交登录

  • 如果您同时拥有 Twitter abc@gmail.com 和 Facebook abc@gmail.com,并且您至少通过这两个帐户登录一次,那么它们现在都是您登录的一部分