PHP, iOS &Android RESTful最佳实践


PHP, iOS & Android RESTful best practise

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

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

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

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

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

你的apache服务器应该不需要特殊的配置,尽管RESTful服务经常使用服务器端重定向(例如/myresource/转到我的script.php?i=myresource)或其他技巧来使更好的url成为可能。

对于最后一点,在RESTful api中没有重定向客户机的概念(好吧,有,但它是不同的)。关键是每个请求执行一个特定的任务,或者失败。这取决于客户端应用程序来处理错误(例如,再次显示登录页面)


查看更多关于身份验证的细节:

不幸的是,我找不到建议这一点的原始文章,我可能有一些部分是错误的,但这种方法是我见过的最安全的:

  • 用户通过调用特定的登录页面登录,该页面生成2个长(可能是32个字符)和完全随机的令牌(称为a和B)并将它们发送回来(并将值存储在数据库中)。为了提高可靠性,它可以检查数据库以确保B令牌是唯一的,但随机性通常会避免这种情况,并且没有安全风险。
  • 每次用户发出新请求时,他们都会发送两个令牌。服务器检查两者是否匹配,并从数据库中知道用户是谁(根据令牌B)。然后生成一个新的随机令牌替换a,并将其发送回(无论API请求是否成功)。
  • 客户端用新的令牌更新它的A令牌,并且可以在以后的请求中使用它。

如果服务器得到一个无效的B令牌,则验证失败。如果它得到一个无效的A令牌,但得到一个有效的B令牌,它假定该帐户已被泄露,并将用户注销(从数据库中删除令牌)。它还可以随时通过删除数据库中的值来注销用户(类似于gmail的log-me-out-from-other-devices功能)

缺点是,如果请求丢失(在发出请求时Internet连接丢失),令牌将不同步,用户将注销。此外,不可能在一个登录会话中同时运行多个请求。通过允许客户端api在失败时自动尝试再次登录,这两者都可以得到改进。

相当复杂,非常安全。您应该让您的身份验证有多复杂取决于您需要它有多安全。