我是专业的 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超时,那么应用会发生什么?它会崩溃吗?用户是否必须再次登录?如果用户杀死设备上的应用程序并再次访问应用程序,他/她是否必须再次执行登录过程?
我心中有太多疑惑。我完全混淆了这些事情。
有人可以更加关注我所面临的问题吗?如果你能详细解释那将是非常好的。
感谢。
答案 0 :(得分:53)
REST因其性质而无会话。您需要在用户登录时生成令牌。您必须在移动客户端上保存此令牌。 对于每个请求,您需要在请求标头中附加有效标记并在服务器端进行检查。 如果令牌过期,则存储在客户端上的令牌无效。因此,由于401响应,您需要再次登录。如果令牌不正确,您需要回复400。 我希望我对你有所帮助。
答案 1 :(得分:19)
与网络浏览器不同,iOS和Android应用程序无法维护会话。通常,一旦用户登录(从服务器验证登录凭据),其登录凭据将保存在客户端。然后,应用程序使用无会话的REST api调用从服务器获取数据。这就是移动应用程序的主要功能。
但是,如果您希望服务器会话和移动应用程序齐头并进(我认为这不是一个好主意),那么方式是
1)当用户登录时,在服务器端生成安全令牌并保存在服务器端和客户端。
2)只要安全令牌有效,移动应用程序就能与服务器通信。
3)会话到期时,安全令牌变为无效。现在,服务器和客户端之间必须了解会话过期时的响应。现在,移动应用必须将用户重定向到登录页面。用户将再次登录,然后与服务器通信。这应该在每次会话到期时发生。
答案 2 :(得分:15)
如果您使用Oauth 2进行身份验证,则常见设置如下:
希望这有帮助。
干杯
答案 3 :(得分:8)
您的服务器应该是完全无状态的,因此不应该存储任何会话.. REST API实际上只是一个带有可选安全性的数据抽象层(通过令牌)
因此,API会公开一个身份验证服务,该服务将使用授权令牌进行响应,以便在后续请求中用作标头,此标记应与每个用户保持1to1关系,并且Universally Unique。它也应该有一个到期时间,此时您的服务器会响应相应的错误响应,请求您的应用刷新令牌,这可以通过单独的刷新令牌系统完成,或者请求用户再次登录以刷新令牌
应该维护状态的APP,而不是服务器。服务器仅用于数据目的,因此不应依赖任何类型的基于会话的身份验证。
答案 4 :(得分:4)
你不应该担心移动开发方面的会话。我对iOS知之甚少,但在Android中我们使用SharedPrefrence
(在本地维护会话的标志)。
答案 5 :(得分:3)
我没有任何使用PHPFox的经验,但这就是移动前端应该如何理想地处理问题:
案例1:主动与服务器通信的移动应用程序:
案例2:移动应用程序在没有任何服务器通信的情况下处于活动状态(例如来电,在应用程序之间移动等):
案例3:用户杀死设备上的应用并重新启动它:
答案 6 :(得分:3)
会话是服务器上的“东西”。它可以是存储有关用户的详细信息的对象(例如会话ID,用户名,电子邮件地址......)或处理未来请求所需的任何其他数据(例如购物车详细信息,交付地址......)。
“某事”通常是一个对象,可以存储在内存中,数据库中,甚至可以序列化并保存到文件系统中(我相信这是PHP中的默认设置)。
因此,当您说“我不知道会话是否在iOS / Android应用程序中维护”时,我担心这没有意义。只有服务器可以维护会话。
通常,客户端唯一知道的事情(Web浏览器或移动应用程序)是会话ID(以令牌或GUID的形式)。这是客户端/应用程序需要记住的唯一内容,它需要与服务器的任何请求一起发送。
它可以存储为cookie和/或作为请求标头发送到服务器。
然后,服务器将从cookie或标头中读取会话ID /令牌,并将从存储会话的位置(文件系统,内存或数据库)检索会话详细信息。这就是当您致电session_start()
时幕后发生的事情。
要了解有关会话处理以及如何创建自定义会话处理程序的更多信息(在您的情况下可能需要从请求标头中获取令牌):
http://php.net/manual/en/function.session-start.php