关于帐号激活邮件的设计

2014-02-18 14:11:38 +08:00
 jayn1985
这两天闲暇时在写一个小应用,遇到了用户注册后,发送激活邮件给用户用以激活帐号的设计问题。
我目前的想法是这样的:在激活链接中传递三个参数,用户的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,所以我很好奇这种方式一般都是怎么校验的呢,难道需要在用户表中新增一个字段用来保存这个字符串,然后验证的时候只要比较下即可?那这种方式代价是不是高了些?所以恳请各位大大都来介绍下你们都是如何设计这个功能的?多谢~
6120 次点击
所在节点    Python
31 条回复
jayn1985
2014-02-19 08:50:44 +08:00
@wingoo
@vob636
@ksc010
@cevincheung
目前先使用原方案做着了,感谢各位的回复~
yayu
2014-02-19 13:38:08 +08:00
@jayn1985 原方案url中暴露用户email,不好。不想加表可以吧email+salt+time用非对称加解密。
lygmqkl
2014-02-19 19:54:25 +08:00
其实有没有考虑过使用user表内的一些不变元素来实现这个功能? 比如说 MD5(email.password) 在用户不修改密码的前提下,只需要增加用户的id 到 verify url 就可以了类似 lee.com/v/1/hashstring 因为在你生成验证之前用户已经保存了,可以额外增加一个字段比如 user_active = 0/1/2 0-new 1-actived 2-blocked.
geew
2014-02-20 09:20:42 +08:00
楼主的方法和我现在用的方法是一样的, 其实这样就够了, 达到目的就行. 然后其他的方法虽然可以让URL看起来清爽点, 但其实差不多. 比如那个建立一张表的方法, 感觉没有必要, 毕竟验证结束了就没啥用了, 感觉浪费了. PS: 这个问题真心不需要纠结....
geew
2014-02-20 09:24:24 +08:00
@yayu
@jayn1985
其实校验url里面可以不用email, 用用户id就行了. 然后把id和ts做个签名, 生成token. url带上这个三个参数就行.
至于暴露问题, 用户id可以设计为一个随机串, 不用数字的方式则更好了. 另, 用户自身的id给他暴露又有什么关系呢
jayn1985
2014-02-20 09:40:35 +08:00
@yayu
@lygmqkl
@geew
感谢回复,如geew童鞋所说,达到目的就行,没必要纠结太多:)
jyhmijack
2014-02-20 12:15:26 +08:00
自从全部使用uuid之后,更加幸福了
jyhmijack
2014-02-20 12:15:56 +08:00
用redis缓存住token对应的uid,过期时间就好了
phpcxy
2014-02-20 14:02:04 +08:00
我现在也是楼主这样的方案,邮件里面给一个按钮他点击。
drivel
2014-02-20 16:16:07 +08:00
@ksc010 Apple 家的 iTunes Store 的做法就是,点击进去之后,需要重新输入账号和密码验证才能激活

那么,完全可以在激活页面加上一个 input form,验证下密码就好
ksc010
2014-02-20 22:03:28 +08:00
@drivel 重点是验证该用户是邮箱的所有者,也就是说有个“token”是只有邮箱所有者与系统知道才行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/100736

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX