如何管理从PHP中的移动应用程序登录的用户的会话?

时间:2015-02-21 15:42:20

标签: php android ios session phpfox

我是专业的 PHP程序员。所以,我对iOS和Android编码一无所知。

该场景是使用名为“PHPFox”的社交网络PHP软件开发的一个网站。

现在有两个类似的移动应用程序可以完全复制本网站的功能。一个移动应用程序在iOS中,另一个在Android中。

所以,我编写了一组RESTful API,我接受来自移动应用程序的请求,解析请求,将请求参数传递给为网站执行相同工作的函数,从此函数获取响应,将其转换为JSON格式并将其发送回移动应用程序。对于iOS和Android应用程序,我使用的是同一组REST API文件。

当用户登录时,将调用用于登录的REST API。最终调用用于身份验证的PHPFox函数,生成安全令牌以及一些其他用户数据。每次登录时,PHPFox都会生成不同的安全令牌。该数据被设置到会话中。现在,每次通过任何REST API文件调用任何函数时,都会验证登录时生成的安全令牌,并且只有成功验证令牌后才会调用PHPFox函数。此验证过程由PHPFox在内部完成。因此,无需将安全性令牌显式或隐式地传递给任何REST API调用。

直到现在一切正常。

我怀疑是从这里开始的。我不知道会话是否在iOS / Android应用程序中维护。那么,如果服务器上的会话,即PHPFox超时,那么应用会发生什么?它会崩溃吗?用户是否必须再次登录?如果用户杀死设备上的应用程序并再次访问应用程序,他/她是否必须再次执行登录过程?

我心中有太多疑惑。我完全混淆了这些事情。

有人可以更加关注我所面临的问题吗?如果你能详细解释那将是非常好的。

感谢。

7 个答案:

答案 0 :(得分:53)

REST因其性质而无会话。您需要在用户登录时生成令牌。您必须在移动客户端上保存此令牌。 对于每个请求,您需要在请求标头中附加有效标记并在服务器端进行检查。 如果令牌过期,则存储在客户端上的令牌无效。因此,由于401响应,您需要再次登录。如果令牌不正确,您需要回复400。 我希望我对你有所帮助。

答案 1 :(得分:19)

与网络浏览器不同,iOS和Android应用程序无法维护会话。通常,一旦用户登录(从服务器验证登录凭据),其登录凭据将保存在客户端。然后,应用程序使用无会话的REST api调用从服务器获取数据。这就是移动应用程序的主要功能。

但是,如果您希望服务器会话和移动应用程序齐头并进(我认为这不是一个好主意),那么方式是

1)当用户登录时,在服务器端生成安全令牌并保存在服务器端和客户端。

2)只要安全令牌有效,移动应用程序就能与服务器通信。

3)会话到期时,安全令牌变为无效。现在,服务器和客户端之间必须了解会话过期时的响应。现在,移动应用必须将用户重定向到登录页面。用户将再次登录,然后与服务器通信。这应该在每次会话到期时发生。

答案 2 :(得分:15)

如果您使用Oauth 2进行身份验证,则常见设置如下:

  • 用户登录移动应用
  • 如果凭据正常,服务器将返回访问令牌,刷新令牌和令牌的生命周期
  • 移动应用程序存储这些值+当前时间戳
  • 在服务器端,垃圾收集器配置为清除过期的令牌
  • 在进行任何api调用之前,移动应用程序会检查令牌是否即将过期(借助存储的值)。如果令牌即将过期,应用程序将发送刷新令牌,指示服务器生成新的访问令牌
  • 如果您希望用户保持联系,可以将应用配置为定期检查访问令牌,并在其过时时请求新的令牌

希望这有帮助。

干杯

答案 3 :(得分:8)

您的服务器应该是完全无状态的,因此不应该存储任何会话.. REST API实际上只是一个带有可选安全性的数据抽象层(通过令牌)

因此,API会公开一个身份验证服务,该服务将使用授权令牌进行响应,以便在后续请求中用作标头,此标记应与每个用户保持1to1关系,并且Universally Unique。它也应该有一个到期时间,此时您的服务器会响应相应的错误响应,请求您的应用刷新令牌,这可以通过单独的刷新令牌系统完成,或者请求用户再次登录以刷新令牌

应该维护状态的APP,而不是服务器。服务器仅用于数据目的,因此不应依赖任何类型的基于会话的身份验证。

答案 4 :(得分:4)

你不应该担心移动开发方面的会话。我对iOS知之甚少,但在Android中我们使用SharedPrefrence(在本地维护会话的标志)。

答案 5 :(得分:3)

我没有任何使用PHPFox的经验,但这就是移动前端应该如何理想地处理问题:

案例1:主动与服务器通信的移动应用程序:

  • 会话超时标记不断增加,会话保持活动状态。

案例2:移动应用程序在没有任何服务器通信的情况下处于活动状态(例如来电,在应用程序之间移动等):

  • 服务器会话可能会暂停,也可能不会暂停。
  • 如果超时,则对服务器的下一次查询将失败,并返回错误。
  • 应用程序消耗此错误并正常地重定向到登录屏幕,并显示一条消息吐司,敦促用户登录。 (这发生在我的银行应用程序中)

案例3:用户杀死设备上的应用并重新启动它:

  • 应用程序应将令牌存储在sqllite或共享首选项中。 (始终登录应用程序采用此方法)
  • 重新启动后,app可以使用presistent令牌查询服务器。
  • 如果会话处于活动状态,则通信会通过,用户可以 继续。如果没有,用户将转到登录屏幕,如案例2所示。

答案 6 :(得分:3)

会话是服务器上的“东西”。它可以是存储有关用户的详细信息的对象(例如会话ID,用户名,电子邮件地址......)或处理未来请求所需的任何其他数据(例如购物车详细信息,交付地址......)。

“某事”通常是一个对象,可以存储在内存中,数据库中,甚至可以序列化并保存到文件系统中(我相信这是PHP中的默认设置)。

因此,当您说“我不知道会话是否在iOS / Android应用程序中维护”时,我担心这没有意义。只有服务器可以维护会话。

通常,客户端唯一知道的事情(Web浏览器或移动应用程序)是会话ID(以令牌或GUID的形式)。这是客户端/应用程序需要记住的唯一内容,它需要与服务器的任何请求一起发送。

它可以存储为cookie和/或作为请求标头发送到服务器。

然后,服务器将从cookie或标头中读取会话ID /令牌,并将从存储会话的位置(文件系统,内存或数据库)检索会话详细信息。这就是当您致电session_start()时幕后发生的事情。

要了解有关会话处理以及如何创建自定义会话处理程序的更多信息(在您的情况下可能需要从请求标头中获取令牌):
http://php.net/manual/en/function.session-start.php