无密码网站认证/登录

Password-less website authentification / login

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

如何实现这样一个系统?(框架和语言无关)

注:我已阅读:

由于我为此搜索了很长时间,这里是我 post 使用 SO 的 "Answer your own question - Q&A-style" 功能的摘要。我会尽可能经常更新它以改进它。

无密码验证方法#1:"Click on the link in the email we just sent you to login"

注册:

  • 客户填写注册表单
  • 客户端AJAXPOSThttp://example.com/_signup{email: 'test@test.com', data: 'data'}
  • 服务器检查用户是否已经存在
  • 客户端消息:"Success: an email has been sent""Fail: already exists"
  • 服务器为用户创建数据库记录
  • 服务器生成一个随机会话 ID + 发送带有 link 的电子邮件:http://example.com/?sessid=f65a5bc45

登录:

  • 客户填写登录表格
  • 客户端AJAXPOSThttp://example.com/_login{email: 'test@test.com'}
  • 客户端留言:"An email has been sent if the account exists"
  • 服务器检查电子邮件是否在数据库中
  • 服务器生成一个随机会话 ID + 发送带有 link 的电子邮件:http://example.com/?sessid=f65a5bc45

打开 link:

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

打开/:

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

无密码验证方法#2:"Enter the code in the email we just sent you to login, e.g. 123 456"

注册:

  • 客户填写注册表单
  • 客户端AJAXPOSThttp://example.com/_signup{email: 'test@test.com', data: 'data'}
  • 客户端消息"An email has been sent, please enter your code here:""Fail: already exists"
  • 服务器为用户创建数据库记录
  • 同上下一段从 (*) 开始

登录:

  • 客户填写登录表格
  • 客户端AJAXPOSThttp://example.com/_login{email: 'test@test.com'}
  • 客户留言"An email has been sent if the account exists, please enter your code here:"
  • 服务器检查数据库中是否有电子邮件
  • (*) 服务器生成随机数+发送邮件:"Here is your code: 123 456"
  • 客户填写代码表
  • 客户端AJAXPOSThttp://example.com/_login{email: 'test@test.com', code: '123456'}
  • 服务器检查代码是否有效。如果是,服务器生成一个随机会话 ID,并发送给客户端
  • 客户端:document.cookie = "sessid=f65a5bc45; expires=Fri, 31 Dec 9999 23:59:59 GMT"(或者用PHP做这个服务器端)
  • 客户端:导航到 /

打开 /

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