这实际上是如何完成的?

How is this actually done?

我正在做一个使用护照 js 和策略(Google、Facebook、本地)进行身份验证的项目。我现在正在研究 google 部分,但有一个小问题。当用户在本地注册时,我将他们的数据保存到数据库(电子邮件、用户名、散列密码),但现在当他们 register/signin 到 google 时,我无法访问他们的密码(很明显)。它在用户模式中是必需的,我不想创建新的用户模式。

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

您可以将另一个字段添加到您的架构中,例如 provider 以指定所使用的身份验证类型。然后,您可以使用 mongoose required validator 仅在提供者为 'local.' 时才需要密码,如下所示:

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';
    }
  }
});

当您使用身份验证提供程序时,他们通常会给您某种“令牌”,可能在您的客户端上或在您服务器上的重定向上(取决于您的实现)。

然后您必须通过提供商验证该令牌(如何执行此操作取决于每个提供商的文档),因为您不能完全相信给定的令牌是有效的。

一旦您向提供商确认令牌有效,通常情况下您可以使用该令牌访问用户的某些信息,例如电子邮件、姓名、phone 号码等(取决于您如何配置您的集成)并可能存储他们使用的提供商(fb、google、apple 等)

然后你可以把这些信息保存在你的schema中,然后为这个用户生成一个session(可能是一个JWT,也可能是一个存储在db上的session)

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

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