0

许多网站都有无密码验证系统,即您只需使用电子邮件即可注册/登录/注销,并且不需要密码。

如何实施这样的系统?(框架和语言无关)

注意:我已经阅读:

4

1 回答 1

1

当我为此搜索了很长时间时,这是我发布的摘要,其中包含 SO 的“回答您自己的问题 - 问答式”功能。我会尽可能多地更新它以改进它。

无密码验证方法#1:“点击我们刚刚发送给您的电子邮件中的链接进行登录”

注册:

  • 客户填写注册表
  • 客户端 AJAX POST http://example.com/_signup {email: 'test@test.com', data: 'data'}
  • 服务器检查用户是否已经存在
  • 客户端消息:“成功:已发送电子邮件”“失败:已存在”
  • 服务器为用户创建数据库记录
  • 服务器生成一个随机会话 ID + 发送带有链接的电子邮件:http ://example.com/?sessid=f65a5bc45

登录:

  • 客户填写登录表格
  • 客户端 AJAX POST http://example.com/_login {email: 'test@test.com'}
  • 客户消息:“如果帐户存在,则已发送电子邮件”
  • 服务器检查电子邮件是否在数据库中
  • 服务器生成一个随机会话 ID + 发送带有链接的电子邮件:http ://example.com/?sessid=f65a5bc45

打开链接:

  • 客户端打开链接http://example.com/?sessid=f65a5bc45
  • 客户端:(document.cookie = "sessid=f65a5bc45; expires=Fri, 31 Dec 9999 23:59:59 GMT"或者做这个服务器端,例如使用 PHP)
  • 客户端:?sessid查询字符串已删除,导航到/

打开/

  • 客户端:AJAX POST example.com/_load{sessid: getCookieValue('sessid')}
  • 服务器检查是否有效的 sessid。如果是,将用户数据发送到客户端
  • 客户端xhr.onreadystatechange:用用户数据填充页面

无密码验证方法#2:“在我们刚刚发送给您的电子邮件中输入密码登录,例如 123 456”

注册:

  • 客户填写注册表
  • 客户端 AJAX POST http://example.com/_signup {email: 'test@test.com', data: 'data'}
  • 客户端消息“已发送电子邮件,请在此处输入您的代码:”“失败:已存在”
  • 服务器为用户创建数据库记录
  • 从 (*) 开始的下一段同上

登录:

  • 客户填写登录表格
  • 客户端 AJAX POST http://example.com/_login {email: 'test@test.com'}
  • 客户消息“如果帐户存在,则已发送电子邮件,请在此处输入您的代码:”
  • 服务器检查数据库中是否有电子邮件
  • (*) server generates random number + sends email: "Here is your code: 123 456"
  • client fills code form
  • client AJAX POST http://example.com/_login {email: 'test@test.com', code: '123456'}
  • server checks if valid code. if so, server generates a random session ID, and sends to client
  • client: document.cookie = "sessid=f65a5bc45; expires=Fri, 31 Dec 9999 23:59:59 GMT" (or do this server side with PHP)
  • client: navigate to /

Open /:

  • client AJAX POST http://example.com/_load {sessid: getCookieValue('sessid')}
  • server checks if valid sessid. if so, sends user data to client
  • client xhr.onreadystatechange: fills page with user data
于 2020-02-16T20:42:56.590 回答