描述:
在保持多步骤流程一致性时我需要用到token(比如找回密码):
步骤1,用户提交要找回密码的用户名和验证码,我生成token1,返回页面中包含这个token1
步骤2,用户提交他收到的短信验证码和token1,我根据token1来识别是哪个用户,短信验证码是否正确,token是否过期,这个token的使用场景是否正确,如果都有效,我生成一个token2,返回页面包含这个token2
步骤3,用户提交他的新密码和token2,我根据token2来找出是哪个用户,最后重置那个用户的密码
这里的token都有时效性,我存在mysql里,每天都要跑cron job来删除过期的token,这样不太好吧,我应该怎么存token?或者有更好的办法?
解决方案1:
token类似于单个web工程中使用的session,保存起来便于查看访问日志,不保存也可以,但每个模块和功能的操作日志最好记录一下,以便后期运营和维护使用。
解决方案2:存redis,设置过期时间是最方便的
解决方案3:token 我是用md5 用户名加 现有密码生成....
然后记录下时间
我一般直接存session
解决方案5:可以存memcahe或redis里,缓存设定时间过期。
解决方案6:token不用存mysql吧,存内存就好了。
一个线程轮训删除过期的token数据。
当然你会说宕机了,内存数据就没了,但是基于找回密码的操作不常有,这个数据不会太多,而时效性一般不会太长,如果真遇到宕机,宕机了用户也无法访问了啊,故这个token就废弃也无所谓,让用户重新提交找回操作。
或者不用储存token,有效性信息就放在token里,你看看这个json web token
解决方案8:token不需要存储的,你可以使用AES的可逆向加/解密算法对数据进行加密,如aes.ecode(userId+time+info+key(密钥)),生成token后把这个串传回给客户端,不需要保存,等下次他传回给你的时候你只需要aes.decode(token)解密一下就可以获得这里面的用户信息与当前登陆的用户信息对比一下就行了
解决方案9:token可以使用 md5(username+userid+timestamp)_timestamp,这种格式的token基本上不会重复了,同时尾部的timestample也能用于过期检测。
对于一个用户来说通常一个token就够了,当你生成第二个token的时候第一个已经失效了,所以可以直接update掉,这样每个用户最多有一个token就不需要考虑删除的问题了,当然在token被验证有效地时候应该把数据库中的token set null,防止同一个token被二次验证。
您可能想查找下面的文章:
- (python)在写一个爬虫,源代码里面没有csrftoken,要如何获取到?
- 有谁知道laravel登录的功能是如何在session中保存用户信息的,我只在session中看到了一个token
- Python报invalidsyntax
- (laravel)不使用remember_token时退出报错,请问如何解决?
- laravel关闭指定控制器方法的CSRF后获取不到session吗
- 如何用php获取某个页面中的input的csrf_token?
- 关于JavaScriptSDK里mainjs的uptoken_url的问题
- laravel54的api路由必须要给user表添加api_token字段?
- 七牛base64存储提示{"error":"badtoken"}
- Laravel有个排除验证token的设置,可是不验证会导致什么安全问题吗?