4

我正处于构建 php/mysql 后端的初始阶段,该后端将 REST 接口暴露给网站和 iphone/android/etc 设备。

我不太确定处理使用同一帐户的多个设备的会话的“标准”或“最佳实践”是什么。

以下是我目前对这将如何工作的想法:

  1. 我现在会使用 MySQL 来存储会话,会话表如下:

    id, session_id (hash), user_id (int), created (timestamp), expire (timestamp), device (enum)

  2. 当用户通过 iOS 应用程序或 android 应用程序登录时,我会在成功 json 中返回一个会话令牌,以供将来使用的 api 调用使用。与进行 api 调用的网站相同。

  3. 出于安全目的,如果用户重新登录,我应该重新生成并覆盖会话令牌,但仅限于该设备的 session_id。

  4. 我还有一个 expire 列,它告诉我会话的到期时间,这样如果我愿意,我可以创建一个可以在两周内到期并由 CRON 作业定期清理的会话。

这对我来说似乎是一种合理的方法,但如果用户使用 iphone 和 ipad,或者使用同一个帐户的多个 android 设备,就会出现问题。任何时候用户使用其中一个登录都会导致另一个注销。

我注意到即使我从另一部 iPhone 登录,instagram 也不会使会话无效。

但是,我认为我不能复制这种行为,除非我在用户重新登录时从不覆盖会话令牌,或者每当用户从 iphone 登录时继续将会话行添加到我的会话表中?

跨不同设备处理会话的标准方法是什么?

4

2 回答 2

3

我强烈建议您不要使用 mysql 来存储会话。我建议使用 redis 或 memcache。Redis 会将数据存储到磁盘中,以防您的服务器崩溃。Redis 还允许您设置 TTL 以使会话过期,这将解决 #4。

如果您使用的是基于休息的调用,我建议您将会话作为 cookie 添加到标头并来回传递。基本上模拟浏览器访问该页面的方式。我认为这也会使测试更容易。

于 2012-08-30T21:17:16.640 回答
1

好吧,您正在寻找的似乎不是大多数传统上所说的“会话”,这通常仅限于单个浏览器或客户端实例。

您似乎更多地谈论将应用程序状态附加到用户登录。在这种情况下,我不明白您为什么需要单独的会话表/令牌系统。您只需使用典型的客户端方法来保持登录,然后当登录的客户端联系您的 API 时,您将返回应用程序“会话”状态信息,而不管您正在与哪个实际客户端实例交谈。

这并不是说您不想使用某种代币交换系统为用户提供“新鲜”代币,以防您想在一段时间不活动后清除他们的状态,只是您可以拥有多个活动代币每次登录。

于 2012-08-30T21:14:52.917 回答