如何处理不同设备的会话?
我正处于构建php / mysql后端的初始阶段,该后端向网站和iphone / android / etc设备公开REST接口。
我不太确定处理使用同一帐户的多个设备的会话的“标准”或“最佳做法”是什么。
以下是我目前关于这将如何工作的想法:
-
我现在会用MySQL来存储会话,会话表如下:
id,session_id(hash),user_id(int),created(timestamp),expire(timestamp),device(enum)
-
当用户通过iOS应用程序或Android应用程序登录时,我会在成功的json中返回会话令牌,以供将来的api调用使用。 与进行api通话的网站相同。
-
出于安全考虑,如果用户重新登录,我应该重新生成并覆盖会话令牌,但仅针对该设备的session_id。
-
我还有一个过期列,它告诉我会话的到期时间,这样如果我愿意,我可以创建一个可以在两周内过期的会话,并定期由CRON作业清除。
这对我来说似乎是一种合理的方法,但如果用户使用iphone和ipad,或者使用同一帐户的多个Android设备,则会出现问题。 任何时候用户登录一个会导致另一个注销。
我注意到即使我从另一台iPhone登录,instagram也没有使会话无效。
但是,我不认为我可以复制该行为,除非用户重新登录时不会覆盖会话令牌,或者每当用户从iphone登录时继续将会话行添加到会话表中?
跨不同设备处理会话的标准方法是什么?
我强烈反对你使用mysql存储会话。 我建议使用redis或memcache。 如果服务器崩溃,Redis会将数据存储到磁盘。 Redis还允许您设置TTL以使会话到期,这将解决#4。
如果您正在使用基于rest的呼叫,我建议您将该会话作为cookie添加到标头中并来回传递。 基本上模仿浏览器访问该页面的方式。 我认为这也会使测试变得更容易。
好吧,看起来你所寻找的并不是大多数传统上称之为“会话”的东西,这通常仅限于单个浏览器或客户端实例。
您似乎正在谈论将应用程序状态附加到用户登录的更多信息。 在这种情况下,我不明白为什么你需要一个单独的会话表/令牌系统。 您只需使用典型的客户端方法来持久登录,然后当登录的客户端与您的API联系时,您将返回应用程序“会话”状态信息,无论您正在与哪个实际客户端实例进行通信。
这并不是说你不想使用某种令牌交换系统来为用户提供“新鲜”令牌,以防你想在一段时间不活动后清除他们的状态,只是你可以拥有多个活动令牌每次登录。
- ApnsPHP:推送通知工作在开发,但不是在生产
- 如何在iOS Objective-C中实现php的openssl_encrypt()方法?
- 警告:stream_socket_client():无法设置私钥文件
- exif数据没有方向 – PHP图像上传
- SMTP电子邮件不在iPhone上发送cordova WebApp,在浏览器中工作?
- didCreatePaymentResult stripeID是一个card_令牌,似乎无法保存给客户
- iOS使用NSJSONSerialization在POST请求中发送JSON数据
- 如何通过点击电子邮件中发送的超链接将用户redirect到移动应用程序或网站? 是否需要在服务器端使用PHP进行处理?
- 共享链接,将打开我的应用程序或应用程序商店