无密码网站认证/登录
Password-less website authentification / login
许多网站都有无密码身份验证系统,即您只需使用电子邮件即可注册/登录/注销,并且永远不需要密码。
如何实现这样一个系统?(框架和语言无关)
注:我已阅读:
The definitive guide to form-based website authentication,
Web 应用程序中的无密码身份验证 - 它有多安全?
和其他一些 security.SE 个帖子
和searched for SO posts about how to actually implement a [password-less]登录系统,但没有成功;我还没有在 SO 上找到关于实现无密码身份验证的规范问题
Manually logging in a user without password 已链接但不是一回事:想法是在 成功创建帐户后立即登录,但不一定是 100 % 无密码认证系统。
由于我为此搜索了很长时间,这里是我 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
:用用户数据填充页面
许多网站都有无密码身份验证系统,即您只需使用电子邮件即可注册/登录/注销,并且永远不需要密码。
如何实现这样一个系统?(框架和语言无关)
注:我已阅读:
The definitive guide to form-based website authentication,
Web 应用程序中的无密码身份验证 - 它有多安全? 和其他一些 security.SE 个帖子
和searched for SO posts about how to actually implement a [password-less]登录系统,但没有成功;我还没有在 SO 上找到关于实现无密码身份验证的规范问题
Manually logging in a user without password 已链接但不是一回事:想法是在 成功创建帐户后立即登录,但不一定是 100 % 无密码认证系统。
由于我为此搜索了很长时间,这里是我 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
:用用户数据填充页面