这两天闲暇时在写一个小应用,遇到了用户注册后,发送激活邮件给用户用以激活帐号的设计问题。
我目前的想法是这样的:在激活链接中传递三个参数,用户的email,发送此邮件时的时间戳ts,以及一个MD5加密后的字符串token(通过md5(secret, email, ts)得出),这样的话,用户在点击这个link后,服务器端获取相关的参数,首先校验token的有效性,通过md5(secret, 传过来的email地址,传过来的ts)与传过来的token比较,这样可以避免用户伪造ts和email;接着判断当前时间和ts的时间差是否满足一个合理的间隔(例如48h),如果一切都OK,那么就将用户设置为激活状态
这种方法目前来看基本可以满足我的需求(至于是否健壮还望各位大大指教),但是这样的话激活link就会比较长,因为需要传送3个参数进去,我参考了下很多网站发送的激活邮件,有类似我这种格式的链接,也有的非常的简短,比如V2EX网站,其激活链接格式为: http://www.v2ex.com/activate/XXXXXXXX,所以我很好奇这种方式一般都是怎么校验的呢,难道需要在用户表中新增一个字段用来保存这个字符串,然后验证的时候只要比较下即可?那这种方式代价是不是高了些?所以恳请各位大大都来介绍下你们都是如何设计这个功能的?多谢~
我目前的想法是这样的:在激活链接中传递三个参数,用户的email,发送此邮件时的时间戳ts,以及一个MD5加密后的字符串token(通过md5(secret, email, ts)得出),这样的话,用户在点击这个link后,服务器端获取相关的参数,首先校验token的有效性,通过md5(secret, 传过来的email地址,传过来的ts)与传过来的token比较,这样可以避免用户伪造ts和email;接着判断当前时间和ts的时间差是否满足一个合理的间隔(例如48h),如果一切都OK,那么就将用户设置为激活状态
这种方法目前来看基本可以满足我的需求(至于是否健壮还望各位大大指教),但是这样的话激活link就会比较长,因为需要传送3个参数进去,我参考了下很多网站发送的激活邮件,有类似我这种格式的链接,也有的非常的简短,比如V2EX网站,其激活链接格式为: http://www.v2ex.com/activate/XXXXXXXX,所以我很好奇这种方式一般都是怎么校验的呢,难道需要在用户表中新增一个字段用来保存这个字符串,然后验证的时候只要比较下即可?那这种方式代价是不是高了些?所以恳请各位大大都来介绍下你们都是如何设计这个功能的?多谢~