跬步 On Coding

邮件密码找回功能实现

思路

公司做项目,有用到注册,登录,密码找回等功能,以前自己写的论坛也实现了邮件密码找回,不过比较简单,直接生成随机密码,把新密码发送到用户邮箱.比较不安全,要实现一般网站的用链接找回的功能.

对链接的要求有如下:

  1. 每次生成的链接都必须不一样;
  2. 链接要有过期时间,过期以后无效;
  3. 后台在链接被请求时,必须验证链接是否有效.

针对这3方面的要求,设计url格式,/resetpassword/?sid=md5加密后的字符串&user=用户名&expires=过期时间时间戳.在user表上增加字段secret_key用于保存加密的密钥.

加密过程,生成sid:

  1. 用户在请求/forgot/表单输入邮件地址,时后台校验用户是否存在,如果存在则,通过uuid生成随机字符串secret_key更新用户信息;
  2. 获取当前时间戳+过期时间,生成过期的时间戳;
  3. md5加密username-expires-secret_key生成sid.

解密验证:

  1. 后台获取到/resetpassword/GET请求后,先验证参数是否正确;
  2. 通过username获取用户信息;
  3. 判断过期时间是否过期;
  4. md5加密username-expires-secret_key与sid对比是否一致,如一致才会返回重置密码表单;
  5. 重置密码表单提交时POST请求提交地址与GET请求一致,必须再次验证sid.