忘记密码 - 只能存储一次但不存储的令牌

时间:2014-11-29 00:42:09

标签: security authentication

这是关于为用户重置他/她的密码生成令牌而不将所述令牌存储在数据库中的问题。此令牌将成为通过电子邮件发送的“重置密码”URL的一部分。

An answer posted by sudo说明您可以向用户发送包含以下信息的令牌

name
expiration date
hash(secret + user name + expiration date)

此方法的问题是用户可能在令牌过期之前多次更改其密码。我认为这非常糟糕,因为这意味着如果用户从保留历史记录的共享计算机访问URL,任何人都可以重置用户的密码(即使只是在有限的时间内)。

所以我的问题是:是否可以拥有一个只能使用一次且不存储在数据库中的令牌?

2 个答案:

答案 0 :(得分:1)

是。获取一个不必存储或管理的一次性使用令牌的简单方法是将用户管理卸载到像Stormpath这样的微服务,它负责管理所有用户管理 - 密码重置,密码存储,用户配置文件,身份验证等。

对于密码重置,此处的内容如下:

  1. 用户在网页上启动密码重置工作
  2. 您使用用户的电子邮件地址或用户名
  3. 对stormpath进行API调用
  4. Stormpath通过链接+令牌向用户(您的"来自"地址,自定义HTML等)发送重置电子邮件。重置令牌是唯一的,一次性使用,如果在24小时内未使用则过期
  5. 用户点击链接并登陆重置页面
  6. 您从URL中提取令牌并检查Stormpath是否进行令牌验证
  7. 用户提交新密码
  8. Stormpath发出重置成功消息(您的"来自"地址,自定义HTML等)
  9. 您可以在此流程中构建自己的用户界面,也可以使用Stormpath包含的开箱即用的自定义ID网站(id.mydomain.com)。

    用户永远不会知道Stormpath存在,您不必管理或存储任何密码或重置令牌。

    完全披露 - 我在Stormpath

    工作

答案 1 :(得分:0)

一种可能的解决方案是使用略有不同的令牌:

user name
expiration date
hash(secret + user name + password_hash + expiration date)

当用户第一次访问密码重置页面时,您可以从数据库中检索其密码哈希,并检查哈希值。它匹配,用户可以重置密码。

当用户使用相同的链接第二次访问密码重置页面时,它将不起作用:password_hash已更改,因此哈希将不匹配。

但是 ....如果用户实际输入了原始密码,则会出现问题。在这种情况下,password_hash将保持不变,令牌将保持有效。由于这种边缘情况,这种解决方案并不真正可行。