即时注销Persona Session
(注:Persona是Mozzilla推出的网络身份系统)
与服务器端Session不同,客户端Session的问题是服务端无法删除Session。
服务器端架构时,你可以删除Session数据。任意的客户端Cookie标识的Session很可能不存在。但客户端架构时,Session数据不在服务端,不能保证Session数据在每个客户端都被删除。换句话说,我们无法同步用户的客户端状态(已经登录)和服务端状态(注销登录)。
为了弥补这个缺陷,客户端Session中添加了过期时间。展开Session数据(被加密打包)前验证过期时间。如果过期了,抛弃Session数据并改变用户状态(如注销登录)。
过期机制在很多应用中运行良好(尤其是短过期时间需求)。如在Persona中,当用户发觉密码收到威胁或已经损坏时,我们需要提供方法让用户立即注销Session数据。
这意味着需要保留一点点状态信息在服务后端。我们处理即时注销的方法是添加一个Token在用户数据表和Session数据中。
每次API调用时比对Session数据中的Token和数据库中的Token。如果不相同,返回错误信息并退出用户。
这样会附加多余的数据库操作去查询Token。幸好,大多数的API调用都需要读取用户数据表,把Token一起带上就好了。









