这实际上是如何完成的?
Posted
技术标签:
【中文标题】这实际上是如何完成的?【英文标题】:How is this actually done? 【发布时间】:2021-06-07 21:28:03 【问题描述】:我正在使用带有策略(谷歌、Facebook、本地)的护照 js 进行身份验证项目。我现在正在研究谷歌部分,但有一个小问题。当用户在本地注册时,我将他们的数据保存到数据库(电子邮件、用户名、哈希密码),但现在当他们通过谷歌注册/登录时,我无法访问他们的密码(显然)。它在用户架构中是必需的,我不想创建新的用户架构。
我可以将密码保存为我从谷歌收到的用户 ID 吗?我真的很想知道我应该走的正确道路。
【问题讨论】:
【参考方案1】:您可以在架构中添加另一个字段,例如 provider
,用于指定所使用的身份验证类型。然后,您可以使用mongoose required validator 仅在提供者为“本地”时才需要密码。像这样的:
const userSchema= new Schema(
firstName: String,
lastName: String,
email: String,
username: String,
provider:
type: String,
enum: ['local', 'google', 'facebook']
,
password:
type: String,
required: function()
return this.provider === 'local';
);
【讨论】:
【参考方案2】:当您使用身份验证提供程序时,他们通常会给您某种“令牌”,可能在您的客户端或服务器上的重定向上(取决于您的实现)。
然后您必须通过提供者验证该令牌(如何做到这一点取决于每个提供者的文档),因为您不能完全相信给定的令牌是有效的。
一旦您向提供商验证令牌有效,通常使用该令牌您可以访问用户的一些信息,例如电子邮件、姓名、电话号码等(取决于您如何配置集成)并且可能存储他们使用的提供商(fb、google、apple 等)
然后你可以将这些信息保存在你的架构中,然后为这个用户生成一个会话(它可能是一个 JWT 或存储在 db 上的会话)
现在,当用户登录时,您将对给定令牌进行与发送的用户相同的验证过程,然后您可以提供一个新会话
总而言之,关键是他们将提供一个令牌,而不是使用用户/密码来验证您的本地数据库来验证用户身份,并且您必须根据他们选择的提供者来验证该令牌
【讨论】:
以上是关于这实际上是如何完成的?的主要内容,如果未能解决你的问题,请参考以下文章