微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这实际上是如何完成的?

如何解决这实际上是如何完成的?

我正在使用带有策略(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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?