用HTTP基本认证设计Restful API

时间:2013-07-25 18:02:07

标签: php api rest session http-authentication

注意:我知道有很多其他StackOverflow问题涉及这个主题。我已经阅读了很多这些以及许多其他网站。我仍然有以下问题。

所以,我正在为新产品构建REST API。目前,该API完全由我们的网站和手机应用程序私人使用。但是,我认为设计API可能会很聪明,以便将来可以公开。

验证

虽然我看过OAuth,但我认为基于SSL的HTTP基本身份验证对我们的API来说足够安全。据我所知,基于SSL的HTTP基本身份验证是一种完全可行的REST API身份验证方法。它也很简单,因为我是API开发的新手,所以对我很有吸引力。

授权

如果用户使用他们的用户名和密码登录API,他们将只能访问API的某些部分。这意味着他们可以访问自己的内容,但不能访问其他用户的内容。此外,它们可能仅限于他们所能做的事情。

除用户帐户外,我还计划拥有其他其他(非用户)帐户以进行更多全局管理任务。这些帐户可能具有对API的完全访问权限。

这是一个好设计吗?或者,以这种方式验证用户是不是很糟糕?我应该只通过这种方式验证我的客户(即应用程序)吗?

会话

我的一个大问题是,在将用户登录到我们的网络应用程序时,如何管理他们的会话? REST规定每个请求都要发送用户名和密码。此外,REST API是无状态的,因此我无法在那里管理会话。但是,我需要跟踪他们以某种方式登录到Web应用程序。他们显然无法为每个请求手动登录。

一种方法是,在用户登录后,我们将其登录凭据(电子邮件和密码)保存到PHP会话中。然后,对API的每个后续请求都可以使用这些凭据。但是,在PHP会话中保存用户名和密码只是感觉不对而且非常不安全。但如果不这样做,人们在与REST API交互时如何管理会话?

手机应用程序更容易,因为您可以将用户的登录凭据保存到钥匙串中。

任何人都可以帮我解决我的设计问题吗?

1 个答案:

答案 0 :(得分:2)

我知道这个问题有点陈旧,也许你已经完成了工作,但我想给你一些提示。也许这些可以帮助你或将来的任何人。 :)

<强>验证

基于SSL的HTTP基本身份验证非常简单,这是真的,但并不像您想象的那么安全。你只需要安装1&#34;假的&#34;客户端上的SSL证书以及处于中间攻击中的人可以嗅探流量。

如何安装假证书?浏览器中的用户并不是那么难,只要在看到巨大的红色警告屏幕时点击确定即可。在移动设备上,例如:http://cryptopath.wordpress.com/2010/01/29/iphone-certificate-flaws/

使用此解决方案,您只需拦截一次流量,并且您将拥有用户的密码!

我的提示:在登录时生成临时密码,并在其他所有请求中使用此密码。因此,攻击者必须拦截密码的登录过程,如果您将此传递存储在手机本地,例如,它会更加困难。 (当然你可以为它添加过期等等......)

<强>授权

我真的不明白你会做什么。用户访问管理是一件好事,但这取决于给定的项目。

<强>会话

不仅REST API,整个HTTP世界都是无状态的。如果您使用PHP会话,它会在客户端的cookie中存储会话ID,浏览器每次都会将此cookie值发送到服务器。

用户不必每次都登录。他们登录一次并获得令牌/临时密码等......(或者如果您不使用这些东西),他们会在每次请求时向您发送一个基本的auth标头。 通过这种方式,您可以轻松跟踪向您发送请求的人,因为您现在已经是该用户的对象,您可以在服务器上存储和链接某些数据。

有很多方法可以处理用户。基本身份验证就是其中之一。并检查一下:OAuth's tokens and sessions in REST &#34; OAuth令牌明确是会话标识符,...&#34;

您不必存储用户的密码和电子邮件,只需在每次请求时检查客户端的标题/ cookies /等等。

  

手机应用程序更容易,因为您可以保存用户的登录信息   凭证到钥匙串。

他们可以,但在手机上保存用户的真实密码是一种非常糟糕的做法。保存时间有限的令牌会好一点。 :)

在所有其他语言中,您可以根据需要存储值。例如,如果您想为您的API使用Python客户端:它在变量中验证并存储令牌或其所需的内容,并在每个其他请求中使用此存储的数据。

还有一个旁注:

  

但是,在PHP会话中保存用户名和密码只是感觉   错误且非常不安全。

确实不安全,但(真正的)PHP会话存储在服务器端,正如我所说,它只在客户端存储一个会话ID。任何能够获得此会话ID的人都可以冒充给定的用户。 (有IP检查等对策......)