Laravel 5.3 - 社交登录疑问

10

我正在开发一款移动应用程序,并且目前依赖JWT来维护API的无状态性。该API被移动设备和Web设备所使用,用户将使用他们的电子邮件和密码进行注册。

我被指派在此API中实现社交登录选项。我希望澄清以下疑问。

1)当使用社交登录时,我如何生成一个令牌[类似于JWT],该令牌将存储在客户端?此令牌应随所有后续请求一起发送。

2)如果社交平台未提供/共享电子邮件地址[这是我们的主要键之一],我需要存储哪些信息?


社交登录只是用来验证谁已经通过身份验证。您仍然会在数据库中拥有该特定用户的用户记录。因此,在他们登录后,您很可能会像往常一样创建JWT。您担心哪个平台不提供电子邮件地址?几乎每个服务也都会有某种类型的用户ID,因此您的用户表可能具有诸如facebook_id``twitter_id等字段... - Pitchinnate
大多数社交平台都会提供电子邮件地址(我相信Twitter除外)。我假设在Web对象成功往返后,您可以将其重定向到您的应用程序。 - Chris Cynarski
@logeeks,你找到你问题的答案了吗? - Simone Cabrino
2个回答

1

简短回答

  1. 您需要将社交登录用户链接到您的标准用户表,并像您已经在做的那样生成(JWT)令牌。
  2. 社交登录始终返回标识社交媒体上用户的ID。在外部表中,存储使用的社交媒体和社交ID,以及主用户表中的用户ID。

长回答

让我们从头开始,以便更好地了解所有问题并澄清你的疑虑的所有方面。

基本用户表
通常情况下,您会拥有一个以这种方式(简化)结构化的用户表

  • user_id
  • 登录名(电子邮件)
  • 密码
  • jwt_token

当用户登录时,您将更新jwt_token字段并将其返回给用户以便使用您的API。

实施社交登录
添加社交登录的一个好方法是创建一个新的social_logins表,其结构如下(简化)

  • 社交类型
  • 社交ID
  • 用户ID

一旦您“社交登录”了一个用户,您就会从社交网络本身获取数据列表。请注意,即使您明确要求,用户也可以禁止检索私人电子邮件地址(例如来自Facebook)。

你需要做的第一件事是检查社交是否返回了用户的电子邮件地址。

  • 如果电子邮件返回,查找您的用户表中具有该电子邮件地址的用户,并在“social_logins”表中创建一个记录,使用user_id字段创建与用户的关系
  • 如果电子邮件为空,则必须在用户表中创建一个新用户,创建一个“虚假”电子邮件地址(使用标准方法 - 不是随机的),然后创建您的social_login记录

为了避免创建重复用户(不同的电子邮件地址),我总是更喜欢询问用户确认他的电子邮件地址:通过这个简单的问题,你可以推迟之前的检查并减少双重用户的数量。因此,如果社交登录未将电子邮件地址返回给您,您只需显示一个空字段,要求用户填写其电子邮件地址,然后您将使用该地址在用户表中查找用户。如果您得到了它,只需向用户显示填好的相同字段,并要求他确认电子邮件地址或更改它,如果他更喜欢使用另一个地址或者如果他已经使用另一个电子邮件地址注册了您的应用程序。


今天,Sitepoint上发布了一篇非常好的文章,介绍如何使用Laravel Socialite轻松添加社交登录功能到你的应用程序中。https://www.sitepoint.com/easily-add-social-logins-to-your-app-with-socialite/ - Simone Cabrino

0

一些社交网络允许委托用户身份验证,而无需在您自己的系统中要求凭据。当用户登录时,外部平台将为您提供可用于获取用户某些信息的访问令牌。

使用这些数据将用户注册到您自己的系统中。同时附加提供的访问令牌。根据您请求的权限,您可以使用该令牌执行社交平台上的其他操作。

然后发布一个JWT,用作用户登录的Web /移动应用程序中的身份验证令牌。请注意,此JWT必须与身份验证提供程序发送的访问令牌独立。包括一些感兴趣的声明,如subexp,并使用秘密密钥进行签名。例如:

 {
   "sub": "userid",     //unique user id assigned in your system 
   "name": "User name"  //Name provided by social 
   "iss": "issuer",     //you are the issuer
   "exp": 1300819380,   //Expiration date
   "login":"facebook"   //login method used
  }

如果您计划使用多个身份验证系统,如Google或Facebook,请不要使用电子邮件作为唯一标识符,因为同一用户的电子邮件可能不同。您需要一个额外的注册过程来链接用户在不同网络中拥有的帐户。例如,让用户设置在其他系统中使用的标识符,或者只需在Facebook登录时启动Twitter的登录过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接