如何以RESTful的方式实现身份验证?

12
我正在使用Python在Google App Engine上构建一个图片日记Web应用程序。用户可以注册并发布图片到他们的日记中。
此外,我尽可能地遵守REST体系结构的规定。
Web应用程序的身份验证方案如下: 1.从前端发布用户名/密码 2.如果验证成功,则后端设置一个cookie。 3.使用此cookie对其余的AJAX调用进行身份验证。
有没有不使用cookies来符合REST的方法?
现在,我还正在构建一个Android应用程序,用户可以登录并发布/查看他们的图片日记。我需要公开Web应用程序数据存储库中的数据,因此我将构建一个Web服务来从数据存储库中提取数据。
Android客户端的身份验证方案: 选项a 1.通过https向Web服务发布用户名/密码 2.Web服务返回唯一的授权令牌(将令牌存储在数据存储库的用户名/密码表中) 3.通过将此令牌添加到请求的请求头来请求后续服务 4.如果找到令牌,则服务器将该令牌映射到用户名/密码表并返回数据 5.授权令牌会在一定时间后过期
选项b 1.在客户端和服务器端设置一个秘密密钥 2.在每个请求的授权标头中使用“用户名:密码和密钥的哈希值” 3.服务器通过使用相同的哈希算法从哈希值中提取密码来生成密码;如果成功,则返回数据 顺便说一下,我不想使用基本授权因为它存在安全漏洞。
哪个更好?
有没有其他更好的方法可以实现我想做的事情?安全性是我非常关心的问题。
我一直在研究什么是最佳解决方案。我认为Leonm建议的2-legged OAuth可能适合我的情况。 在这种情况下,服务器必须向客户端提供使用者密钥/密钥对,而这在我的应用程序中是硬编码的。现在的步骤如下:
1. 使用oauth_parameters(consumer_key,signature_method,timestamp),请求url,请求参数和SECRET生成签名。
2. 在发出请求时包括签名和oauth参数。
3. 服务器通过再次生成签名来验证请求,但这次使用与密钥对应的SECRET。
我认为这样做基本上是符合REST原则的。据我所知,服务器是无状态的。
这种方法的优缺点是什么?
3个回答

6
如果"安全是一个问题",那么我会建议您使用开放标准和库来实现您想要的。这样做的主要原因是,如果您自己实现,很可能会忘记某些东西;这些标准已经有很多人在审查它们,寻找漏洞。
您的选择包括(按复杂程度递增):
基本身份验证和HTTPS
一切都被加密,这使得无法压缩或查看内容,增加了服务器上的负载,以及客户端上更多的电池功耗。由于得到库的良好支持,因此实现简单。
摘要身份验证
未加密的消息通过线路传输,但认证在授权头中得到安全管理。请参阅wikipedia entry以获取更多信息。
OAuth
请参见Google如何为安装的应用程序提供OAuth。我认为这不是您要寻求的,因为您并不需要在应用程序之间共享数据,只需要对用户进行身份验证。

自己动手

如果你想自己动手,我建议看看例如谷歌的(现在已弃用的?)ClientLogin 如何工作。

  1. 客户端将获取受保护的资源,并获得401,其中包含执行GoogleLogin身份验证的说明,包括要执行登录本身的URI
  2. 客户端(知道如何做此操作)以特定方式向该URI发送请求
  3. 服务器响应具有特定响应,包括(长)令牌
  4. 客户端现在可以使用该令牌对受保护的资源执行GET请求。

无状态性

您引用了REST,它规定请求不应特别依赖于先前的交互:“…每个从客户端到服务器的请求都必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。”(fielding)这意味着服务器不应在表格中存储会话上下文(如身份验证令牌)。

一种解决方法是使用基于令牌的方法之一(其中服务器告诉客户端应该用于未来请求的令牌),其中令牌不是随机数字,而是发送给服务器本身的消息。为了防止客户端篡改,可以进行签名,如果你担心客户端查看它,可以加密。

编辑:虽然我不确定,但谷歌拥有所有已发行的身份验证令牌表格似乎不太可能;其令牌长度表明该令牌是一些加密的消息,证明持有此令牌的人实际上在某个领域的某个时间提供了真实凭据。


3

OAuth 是一种标准化的方式,能够帮助您实现所需功能。


我不会向其他客户端公开Web服务,除了我自己正在构建的Android应用程序。我正在使用Android UI工具包构建登录页面。就我所了解的OAuth而言,它是在您希望将用户数据暴露给其他应用程序时使用的。此外,它使用浏览器让用户登录,而我并不想使用它。我倾向于之前提到的选项a进行身份验证。但是,我希望确保其足够安全并符合REST原则。谢谢 - Marty
1
有2-legged和3-legged oauth。2-legged oauth可以将您的Android应用程序识别给服务器。 - leonm

1

您可以使用HTTPS和HTTP基本身份验证的组合。两者都是现有的标准,当一起使用时应该足够安全。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接