PHP,iOS& ;;Android RESTful最佳实践

PHP,iOS& ;;Android RESTful最佳实践,php,apache,rest,Php,Apache,Rest,我计划在PHP中开发一个RESTful web应用程序,然后在iOS和Android应用程序中使用相同的web服务。在web应用程序登录时,我将通过身份验证头中的ajax和HTTPS发送用户凭据 这真的安全吗 在我访问的域中,我发出的每个新请求和页面都会记住这些凭据吗 我必须在Apache服务器上配置任何东西吗 如果凭据错误或未设置,我必须重定向到登录页面的何处 我计划在PHP代码中检查用户是否存在,如果不存在,则返回错误代码,但这不会重定向到登录页面。我有点迷路了 https确实是安全的。

我计划在PHP中开发一个RESTful web应用程序,然后在iOS和Android应用程序中使用相同的web服务。在web应用程序登录时,我将通过身份验证头中的ajax和HTTPS发送用户凭据

  • 这真的安全吗
  • 在我访问的域中,我发出的每个新请求和页面都会记住这些凭据吗
  • 我必须在Apache服务器上配置任何东西吗
  • 如果凭据错误或未设置,我必须重定向到登录页面的何处

我计划在PHP代码中检查用户是否存在,如果不存在,则返回错误代码,但这不会重定向到登录页面。我有点迷路了

https确实是安全的。或者至少这是我们最好的。当然,您必须小心始终使用https,不要通过http发送某些数据,否则可能会打开攻击途径

进行身份验证的通常方法是登录一次,然后返回一个临时令牌(就像传统web应用程序中的会话),该令牌可用于以后的所有请求。这允许您在任何时候(或者在设定的时间之后)撤销令牌。您可以更进一步,使用随每个请求而变化的令牌,但您正进入一个非常复杂的领域

您的apache服务器不需要特殊配置,尽管RESTful服务通常使用服务器端重定向(例如,
/myresource/
转到my
script.php?i=myresource
)或其他技巧来实现更好的URL

最后一点,在RESTfulAPI中没有重定向客户机的概念(虽然有,但不同)。关键是每个请求执行一个特定的任务,或者失败。由客户端应用程序处理错误(例如,再次显示登录页面)


要详细了解身份验证,请执行以下操作:

不幸的是,我找不到这方面的原始文章,我可能有一些地方错了,但这种方法是我见过的最安全的:

  • 用户通过调用特定的登录页面登录,该页面生成2个长(可能32个字符)和完全随机的令牌(称它们为a和B),并将它们发送回(并将值存储在数据库中)。为了获得更好的可靠性,它可以检查数据库以确保B令牌是唯一的,但随机性通常可以避免这一点,并且没有安全风险
  • 每次用户发出新请求时,他们都会发送两个令牌。服务器检查两者是否匹配,并从数据库中知道用户是谁(根据令牌B)。然后,它生成一个新的随机令牌来替换,并将其发回(无论API请求是否成功)
  • 客户机使用新的令牌更新其A令牌,并且可以在将来的请求中使用它
如果服务器获取了无效的B令牌,则身份验证失败。如果服务器获取了无效的A令牌,但却是有效的B令牌,则会假定帐户已受损并注销用户(从数据库中删除令牌)。它还可以随时通过从数据库中删除值来注销用户(类似于gmail的“从其他设备注销”功能)

缺点是,如果请求丢失(在发出请求时丢失了Internet连接),令牌将不同步,用户将注销。此外,不可能为单个登录会话同时运行多个请求。允许客户端api在出现故障时自动尝试再次登录,这两种情况都可以得到改善


非常复杂,非常安全。身份验证的复杂程度取决于您需要的安全程度。

您的意思是像随机字符串一样,我与用户关联,然后将其保存在会话中?我应该如何实现?将令牌保存在数据库中?我想我应该在每个请求中发送凭据,因为使用会话变量bles不是RESTful。我想知道的是,我是否必须将该令牌或用户/密码保存在任何位置,或者身份验证头是否在服务器的所有请求中都存在。谢谢你的回答。不要将会话用于REST API。你应该像会话那样做,但要自己实现它(Cookie通常不用于RESTful服务,会话使用Cookie)。解释如何做到这一点是一篇文章,而不是答案,因此,如果您不确定,请在某个地方查找。您可以在每个请求中发送登录凭据,但如果需要非常高的安全性,则不可以。我找不到我喜欢的文章,因此我更新了答案,并提供了有关安全身份验证方法的详细信息。这似乎非常安全,但我仍然找不到安全的存储令牌而不使用会话变量的方法。我必须将它们保存在JavaScript变量中并通过GET发送到每个页面吗?这是我唯一能想到的方法。再次感谢。我GET对于相关的随机令牌是非常安全的,但不一样,因为当客户端登录时,我必须将它们都发送到客户端?