如何解决这实际上是如何完成的?
我正在使用带有策略(Google、Facebook、Local)的护照 js 进行身份验证的项目。我现在正在研究 google 部分,但有一个小问题。当用户在本地注册时,我将他们的数据保存到数据库(电子邮件、用户名、哈希密码),但现在当他们通过谷歌注册/登录时,我无法访问他们的密码(显然)。它在用户架构中是必需的,我不想创建新的用户架构。
我可以将密码保存为我从谷歌收到的用户 ID 吗?我真的很想知道我应该走的正确道路。
解决方法
您可以向架构中添加另一个字段,例如 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';
}
}
});
,
当您使用身份验证提供程序时,他们通常会给您某种“令牌”,可能是在您的客户端上,也可能是在您的服务器上的重定向(取决于您的实现)。
然后您必须与提供者一起验证该令牌(如何执行此操作取决于每个提供者的文档),因为您不能完全相信给定的令牌有效。
一旦您与提供商确认令牌有效,通常您可以使用该令牌访问用户的某些信息,例如电子邮件、姓名、电话号码等(取决于您如何配置集成)并可能存储他们使用的提供商(fb、google、apple 等)
然后你可以将这些信息保存在你的schema中,然后为这个用户生成一个会话(可能是一个JWT或者一个存储在db上的会话)
现在,当用户登录时,您将对给定的令牌与发送的用户执行相同的验证过程,然后您可以提供新的会话
总而言之,关键是他们将提供一个令牌,而不是使用 user/pwd 来验证您的本地数据库来验证用户的身份,而您必须根据他们选择的提供者验证该令牌
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。