【问题标题】:How is this actually done?这实际上是如何完成的?
【发布时间】:2021-06-07 21:28:03
【问题描述】:

我正在使用带有策略(谷歌、Facebook、本地)的护照 js 进行身份验证项目。我现在正在研究谷歌部分,但有一个小问题。当用户在本地注册时,我将他们的数据保存到数据库(电子邮件、用户名、哈希密码),但现在当他们通过谷歌注册/登录时,我无法访问他们的密码(显然)。它在用户架构中是必需的,我不想创建新的用户架构。

我可以将密码保存为我从谷歌收到的用户 ID 吗?我真的很想知道我应该走的正确道路。

【问题讨论】:

    标签: node.js mongoose passport.js passport-local passport-google-oauth


    【解决方案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 上的会话)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多