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

标签 authentication database-design login oauth single-sign-on

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

用户通过我们的 API 通过 POST 到/session 端点“登录”。 API 响应是一个新的 secret token (我们将其与用户名关联)。客户端使用此 token 来签署由客户端发起的所有 POST 请求,我们的 API 稍后会使用这些请求对请求进行身份验证。

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

我的问题:我需要对 API 进行哪些更改才能支持社交登录?我是否需要对我的数据库架构进行重大更改以支持这一点,如果需要,究竟是什么?此外,服务器是否需要了解社交登录提供者授予的访问 token ?

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

通常对如何正确实现这一点感到困惑。我更愿意让事情尽可能简单,以便为简单的解决方案加分。任何建议将不胜感激。

最佳答案

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

  • 用户(用户 ID 整数、昵称 varchar(64)、电子邮件 varchar(255)、密码 varchar(64)、email_verified bool 值、启用 bool 值、created_at timestamptz、updated_at timestamptz)
  • 这里需要注意的是 user_id 是主键,昵称是唯一的,电子邮件是唯一的,email_verified 的默认值是 FALSE,启用的默认值是 TRUE,由于社交登录,密码是可选的
  • 我的 social_tokens 表看起来像这样

  • social_tokens (provider_user_id varchar(255), provider_type enum('facebook', 'twitter', 'google', 'github'), user_id integer, access_token varchar(255), refresh_token varchar(255), expires timestamptz, created_at timestamptz, udpated_at timestamptz)
  • provider_user_id 是社交网络分配给每个用户的唯一 ID
  • provider_type 是一个枚举,在我的例子中是 4 个值,facebook、twitter、google 和 github
  • user_id 引用来自 users 表的 user_id
  • access_token 和 refresh_token(如果提供)只是提供者分配的 token
  • 谷歌似乎有过期的概念,所以我也添加了一个过期列,其余的都是可选的
  • PRIMARY KEY 是 (provider_user_id, provider_type, user_id) 的组合,因为单个用户可能有多个社交登录,因此 user_id 不能作为主键
  • 虽然可以说 provider_user_id 对于给定社交网络中的每个用户都是唯一的,但不同的社交网络呢?因此组合
  • 这个想法是每个用户可能有多个社交登录
  • 如果您同时拥有 Twitter abc@gmail.com 和 Facebook abc@gmail.com,并且您至少同时通过这两个网站登录,那么它们现在都是您登录的一部分
  • 关于authentication - 如何将社交登录集成到我现有的用户架构/登录系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748208/

    相关文章:

    android - 使用 android.accounts 身份验证器时出现问题

    authentication - Ember-Data + AMS => JSON 或 HTTP header 的 Ember.js 身份验证 token ?

    java - 应用程序用户身份验证java mongodb模块

    php - 在 mysql 数据库中存储帖子 + 评论

    ios - 首次登录应用后自动填充iOS12提示信息用户保存密码?

    带有 STARTTLS 和身份验证的 Python Twisted TLS 连接 - 示例代码中的错误?

    mysql - 关系数据库设计 : How to design relationships with long paths?

    mysql - SQL 如何构建这个特定的数据库模式

    web-applications - 为什么https仅用于登录?

    asp.net - 在ASP.NET登录控件中使用电子邮件作为用户名