我正在开发一款移动应用程序,并且目前依赖JWT来维护API的无状态性。该API被移动设备和Web设备所使用,用户将使用他们的电子邮件和密码进行注册。
我被指派在此API中实现社交登录选项。我希望澄清以下疑问。
1)当使用社交登录时,我如何生成一个令牌[类似于JWT],该令牌将存储在客户端?此令牌应随所有后续请求一起发送。
2)如果社交平台未提供/共享电子邮件地址[这是我们的主要键之一],我需要存储哪些信息?
简短回答
长回答
让我们从头开始,以便更好地了解所有问题并澄清你的疑虑的所有方面。
基本用户表
通常情况下,您会拥有一个以这种方式(简化)结构化的用户表
当用户登录时,您将更新jwt_token字段并将其返回给用户以便使用您的API。
实施社交登录
添加社交登录的一个好方法是创建一个新的social_logins表,其结构如下(简化)
一旦您“社交登录”了一个用户,您就会从社交网络本身获取数据列表。请注意,即使您明确要求,用户也可以禁止检索私人电子邮件地址(例如来自Facebook)。
你需要做的第一件事是检查社交是否返回了用户的电子邮件地址。
为了避免创建重复用户(不同的电子邮件地址),我总是更喜欢询问用户确认他的电子邮件地址:通过这个简单的问题,你可以推迟之前的检查并减少双重用户的数量。因此,如果社交登录未将电子邮件地址返回给您,您只需显示一个空字段,要求用户填写其电子邮件地址,然后您将使用该地址在用户表中查找用户。如果您得到了它,只需向用户显示填好的相同字段,并要求他确认电子邮件地址或更改它,如果他更喜欢使用另一个地址或者如果他已经使用另一个电子邮件地址注册了您的应用程序。
一些社交网络允许委托用户身份验证,而无需在您自己的系统中要求凭据。当用户登录时,外部平台将为您提供可用于获取用户某些信息的访问令牌。
使用这些数据将用户注册到您自己的系统中。同时附加提供的访问令牌。根据您请求的权限,您可以使用该令牌执行社交平台上的其他操作。
然后发布一个JWT,用作用户登录的Web /移动应用程序中的身份验证令牌。请注意,此JWT必须与身份验证提供程序发送的访问令牌独立。包括一些感兴趣的声明,如sub
或exp
,并使用秘密密钥进行签名。例如:
{
"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
}
facebook_id``twitter_id
等字段... - Pitchinnate