php - 如何存储token比较合适?
黄舟
黄舟 2017-04-10 15:52:11
[PHP讨论组]

在保持多步骤流程一致性时我需要用到token(比如找回密码):

步骤1,用户提交要找回密码的用户名和验证码,我生成token1,返回页面中包含这个token1

步骤2,用户提交他收到的短信验证码和token1,我根据token1来识别是哪个用户,短信验证码是否正确,token是否过期,这个token的使用场景是否正确,如果都有效,我生成一个token2,返回页面包含这个token2

步骤3,用户提交他的新密码和token2,我根据token2来找出是哪个用户,最后重置那个用户的密码

这里的token都有时效性,我存在mysql里,每天都要跑cron job来删除过期的token,这样不太好吧,我应该怎么存token?或者有更好的办法?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(9)
ringa_lee

token可以使用 md5(username+userid+timestamp)_timestamp,这种格式的token基本上不会重复了,同时尾部的timestample也能用于过期检测。
对于一个用户来说通常一个token就够了,当你生成第二个token的时候第一个已经失效了,所以可以直接update掉,这样每个用户最多有一个token就不需要考虑删除的问题了,当然在token被验证有效地时候应该把数据库中的token set null,防止同一个token被二次验证。

PHP中文网

token不需要存储的,你可以使用AES的可逆向加/解密算法对数据进行加密,如aes.ecode(userId+time+info+key(密钥)),生成token后把这个串传回给客户端,不需要保存,等下次他传回给你的时候你只需要aes.decode(token)解密一下就可以获得这里面的用户信息与当前登陆的用户信息对比一下就行了

PHP中文网

或者不用储存token,有效性信息就放在token里,你看看这个json web token

天蓬老师

token不用存mysql吧,存内存就好了。
一个线程轮训删除过期的token数据。
当然你会说宕机了,内存数据就没了,但是基于找回密码的操作不常有,这个数据不会太多,而时效性一般不会太长,如果真遇到宕机,宕机了用户也无法访问了啊,故这个token就废弃也无所谓,让用户重新提交找回操作。

PHPz

可以存memcahe或redis里,缓存设定时间过期。

PHPz

我一般直接存session

怪我咯

token 我是用md5 用户名加 现有密码生成....
然后记录下时间

PHPz

存redis,设置过期时间是最方便的

阿神

token类似于单个web工程中使用的session,保存起来便于查看访问日志,不保存也可以,但每个模块和功能的操作日志最好记录一下,以便后期运营和维护使用。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号