这实际上是如何完成的?

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 上的会话)

现在,当用户登录时,您将对给定令牌进行与发送的用户相同的验证过程,然后您可以提供一个新会话

总而言之,关键是他们将提供一个令牌,而不是使用用户/密码来验证您的本地数据库来验证用户身份,并且您必须根据他们选择的提供者来验证该令牌

【讨论】:

以上是关于这实际上是如何完成的?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 html5 嵌入视频完成播放?

如何在python中完成相对导入

如何有效提高团队成员的工作效率

如何估计用户的实际位置?

杂志样版面是如何制作的? [关闭]

如何在Django中调试,好方法? [关闭]