如何处理跨不同设备的会话?

5
我正在建立一个PHP/MySQL后端,为网站和iPhone/Android等设备提供REST接口的初始阶段。我不太确定在处理使用同一帐户的多个设备的会话时,“标准”或“最佳实践”是什么。
以下是我目前关于如何解决这个问题的想法:
1. 我将使用MySQL来存储会话,使用类似下面这样的sessions表: id、session_id(哈希)、user_id(整数)、created(时间戳)、expire(时间戳)、device(枚举) 2. 当用户通过iOS应用程序或Android应用程序登录时,我将返回一个会话令牌到成功JSON中,以便未来的API调用使用。网站进行API调用时也一样。 3. 为了安全起见,如果用户重新登录,则应重新生成并覆盖该设备的session_id,但仅限于该设备的session_id。 4. 我还有一个过期列,告诉我会话的过期时间,因此如果需要,我可以创建一个会在两周内到期并由CRON作业定期清理的会话。
这对我来说似乎是合理的方法,但是如果用户使用iPhone和iPad或多个使用同一帐户的Android设备,则会存在问题。任何时候,用户通过其中一个设备登录都会导致另一个设备注销。我注意到Instagram即使我从另一个iPhone登录,也不会使会话失效。但是,我认为我无法复制这种行为,除非当用户重新登录时,我从不覆盖会话令牌或在iPhone上每次登录时都向我的会话表中添加新的会话行?
处理跨不同设备的会话的标准方法是什么?

你可以为每个会话存储额外的信息,比如浏览器和 IP 地址。只有当用户在新地方登录时,才清除这些具有匹配细节的会话。 - BenOfTheNorth
2个回答

4
我强烈不建议您使用mysql来存储会话。我建议使用redis或memcache。Redis会将数据存储到磁盘中,以防服务器崩溃。Redis还允许您设置TTL来过期会话,这可以解决问题#4。
如果您正在使用rest调用,我建议只将会话作为cookie添加到标头中并来回传递。基本上模拟浏览器访问该页面的方式。我认为这也会使测试更容易。

2

看起来你所寻找的并不是传统意义上的“会话”,这通常只限于单个浏览器或客户端实例。

似乎你更关心的是将应用程序状态附加到用户登录上。在这种情况下,我不明白为什么你需要一个单独的会话表/令牌系统。你只需使用典型的客户端持久化登录方法,然后当已登录的客户端联系你的API时,无论你正在与哪个实际的客户端实例交互,你都会返回应用程序“会话”状态信息。

这并不是说你不想使用某种令牌交换系统,在某些情况下,你想在一段时间的不活动后清除他们的状态,只是你可以有多个活动令牌每个登录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接