如何pipe理从PHP中的移动应用程序login用户的会话?

我是专业的PHP程序员 。 所以,我不了解iOS和Android编码。

该场景是使用社交networkingPHP软件标题为“PHPFox”开发的一个网站。

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

所以,我写了一套RESTful API,接受来自移动应用程序的请求,parsing请求,将请求parameter passing给为网站做同样工作的函数,从这个函数获取响应,将其转换转换成JSON格式并发送回移动应用程序。 对于iOS和Android应用程序,我使用的是相同的一组REST API文件。

当用户login时,用于login的REST API被调用。 最终调用PHPFox函数被调用,一个安全令牌和其他一些用户数据一起被生成。 每次login时,不同的安全令牌都由PHPFox生成。 这个数据被设置到会话中。 现在,每当我通过任何REST API文件调用任何函数时,在login时生成的安全令牌都会被validation,只有在成功validation令牌后才会调用PHPFox函数。 这个validation过程由PHPFox内部完成。 因此,不需要将安全令牌显式或隐式地传递给任何REST API调用。

直到现在一切工作都很好。

我的怀疑从这里开始。 我不知道会话是否在iOS / Android应用程序中维护。 所以,如果服务器上的会话,即PHPFox得到超时,那么应用程序会发生什么? 会不会崩溃? 用户是否需要再次login? 如果用户杀死了设备上的应用程序,并再次进入应用程序,他/她是否必须再次进行login过程?

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

有人可以把更多的重点放在我面临的问题上吗? 如果你能详细解释,这将是非常好的。

谢谢。

Solutions Collecting From Web of "如何pipe理从PHP中的移动应用程序login用户的会话?"

REST本质上没有任何问题。 您需要在用户login时生成令牌。您必须将此令牌保存在您的移动客户端上。 对于每个请求,您都需要在请求标头中附加一个有效的标记,并在服务器端进行检查。 如果令牌过期,则存储在客户端上的令牌无效。 所以,你需要重新login401响应。 如果令牌不正确,您需要回复400.我希望我对您有所帮助。

与网页浏览器不同,iOS和Android应用程序无法维护会话。 通常,一旦用户login(从服务器validationlogin凭证),其login凭证将保存在客户端。 然后,应用程序使用会话较less的REST API调用从服务器获取数据。 这是移动应用程序中的大部分工作。

但是,如果你想要服务器会话和手机应用程序(我不认为这是一个好主意),方式是

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

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

3)会话过期时,安全令牌变为无效。 现在服务器和客户端之间必须有一个关于会话过期时的响应的理解。 现在,移动应用必须将用户redirect到login页面。 用户将再次login,然后与服务器通信。 每当会话过期时都会发生这种情况。

如果您正在使用Oauth 2进行身份validation,以下是常见设置:

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

希望这可以帮助。

干杯

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

因此,您的API公开了一个身份validation服务,该身份validation服务将使用授权令牌进行响应,以便在随后的请求中用作头,此令牌应与每个用户成为1to1关系,并且具有通用唯一性。 它也应该有一个到期时间,此时服务器会响应适当的错误响应,请求您的应用程序刷新令牌,这可以通过单独的刷新令牌系统来完成,也可以请求用户再次login以刷新令牌。

应该维护状态的是APP,而不是服务器。 服务器仅仅是出于数据目的,所以不应该依赖任何种类的基于会话的authentication。

你不应该担心从移动开发方面的会议。我不知道iOS的很多,但在Android我们使用SharedPrefrence (旗本地维护会话)。

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

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

所以当你说“我不知道会话是否在iOS / Android应用中维护”时,恐怕没有任何意义。 只有服务器可以维护会话。

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

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

然后,服务器将从cookie或标题中读取会话标识/标记,并从存储会话的位置(文件系统,内存或数据库)中检索会话详细信息。 当你调用session_start()时,这就是幕后的情况。

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

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

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

  • 会话超时戳持续激活,会话保持活动状态。

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

  • 服务器会话可能会或可能不会超时。
  • 如果超时,则向服务器的下一个查询将失败身份validation并返回错误。
  • 应用程序消耗此错误,并优雅地redirect到login屏幕与消息吐司催促用户login。 (这发生在我的银行应用程序)

情况3:用户杀死设备上的应用并重新启动:

  • 应用程序应该以sqllite或共享首选项存储令牌。 (总是login应用程序采取这种方法)
  • 重新启动后,应用程序可以使用持续令牌查询服务器。
  • 如果会话处于活动状态,则通信会通过,用户可以继续。 如果不是,则如例2所示,用户转到login屏幕。

这就需要一种全新的authentication和授权方式。 以前在只有基于浏览器的系统devise中,我们会根据会话和cookie来处理所有这些。 在这里,我们需要考虑超越(或者下面的东西)。 JSON WEB TOKEN是一种方式, 每个请求将使用令牌携带通信的概念进行操纵

https://jwt.io/

欲了解更多关于JWT其他类似程序的更多信息。