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

如何以restful方式实现身份验证?,rest,service,authorization,Rest,Service,Authorization,我正在使用python在web应用程序google app engine上构建一个图片日志。用户可以注册并将图片发布到日志中 此外,我正试图尽可能多地遵循其余的做事架构 web应用程序的身份验证方案如下所示: 1.从前端发布用户名/密码 2.如果身份验证成功,后端将设置cookie 3.其余的AJAX调用使用此cookie进行身份验证 有没有办法不使用cookies就遵守REST 现在,我还在构建一个android应用程序,用户可以登录并发布/查看他们的图片日志。我需要公开web应用程序数据存储

我正在使用python在web应用程序google app engine上构建一个图片日志。用户可以注册并将图片发布到日志中

此外,我正试图尽可能多地遵循其余的做事架构

web应用程序的身份验证方案如下所示:
1.从前端发布用户名/密码
2.如果身份验证成功,后端将设置cookie
3.其余的AJAX调用使用此cookie进行身份验证

有没有办法不使用cookies就遵守REST

现在,我还在构建一个android应用程序,用户可以登录并发布/查看他们的图片日志。我需要公开web应用程序数据存储中的数据,因此我将构建一个web服务来从数据存储中获取数据

android客户端的身份验证方案:
选项a
1.通过https将用户名/密码发布到web服务
2.Web服务返回唯一的授权令牌(将令牌存储在数据存储上的username/pwd表中)
3.通过将此令牌添加到请求的请求标头来请求后续服务
4.服务器将令牌映射到username/pwd表,并在找到令牌时返回数据
5.授权令牌在一段时间后过期

选项b
1.在客户端和服务器端设置密钥
2.在每个请求的授权头中使用“用户名:密码和密钥哈希”
3.服务器通过使用相同的哈希算法从哈希值提取密码来生成密码;如果成功,则返回数据
顺便说一句,我不想使用基本授权,因为它存在安全漏洞

哪个更好

有没有其他更好的方法来完成我想做的事情?顺便说一句,安全是我非常关心的问题。
如果有人对这个问题有任何见解,我将不胜感激。谢谢


我自己也在做一些研究,想知道什么是最好的解决方案。我认为2条腿的oauth可能会像Leonm建议的那样在我的情况下起作用。
在这种情况下,服务器必须向客户端提供消费者密钥/密码,在我的情况下,该密钥/密码在应用程序中是硬编码的

现在的步骤是:
1.使用oauth_参数(使用者密钥、签名方法、时间戳)、请求url、请求参数和密码生成签名。
2.在发出请求时包括签名、oauth参数。
3.服务器通过再次生成签名来验证请求,但在这种情况下,它使用与密钥对应的密钥

我认为这样我就相当于确认了其余的原则。据我所知,服务器是空的


这样做的利弊是什么

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

以标准的方式完成您想要做的事情

如果“安全是一个问题”,那么我会说,使用开放标准和库来实现您想要的功能会更好。主要原因是如果你自己做,你很可能会忘记一些事情;这些标准有很多人在关注它们,寻找漏洞

您的选择包括(增加复杂性)

基本身份验证和HTTPS 一切都是加密的,这使得压缩或查看变得不可能,这在一定程度上增加了开销,在服务器上使用了更多的马力,在客户端可能使用了更多的电池电量。易于实现,因为它得到了库的良好支持

摘要认证 未加密的消息通过网络传输,但身份验证在授权标头中安全管理。有关更多信息,请参阅

非统组织 请参阅如何为已安装的应用程序提供OAuth。我相信这不是您想要的,因为您不要求在应用程序之间共享数据,而只是验证用户

滚你自己的 如果你想推出自己的,我建议看看谷歌(现在已经弃用了?)过去是如何运作的

  • 客户端将获得一个受保护的资源,并获得一个401,其中包含执行GoogleLogin身份验证的指令,包括用于执行登录本身的URI
  • 客户机(知道如何做到这一点)以特定的方式向该URI发布请求
  • 服务器用一个特定的响应进行响应,该响应包括一个(长)令牌
  • 客户端现在可以使用该令牌执行对受保护资源的GET请求
  • 无国籍 您引用了REST,它规定请求不应特别依赖于之前的交互:“……从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。”()这意味着服务器不应存储会话上下文(像身份验证令牌)在表中

    解决这一问题的一种方法是使用任何基于令牌的方法(其中服务器告诉客户端它应该用于未来请求的令牌)其中令牌不是随机数,而是发送给服务器本身的消息。为了保护自己免受客户端篡改,可以对其进行签名,如果您害怕客户端看到它,可以对其进行加密


    编辑:虽然我不确定,但谷歌似乎不太可能有一个包含所有认证令牌的表;他们令牌的长度表明令牌是某种加密消息,证明持有该令牌的人在某个时间确实在某个领域提供了真实的凭据。

    我没有公开web服务除了我自己正在构建的android应用程序之外,我正在使用android UI toolkit构建登录页面。据我所知,OAuth是在您希望将用户数据公开给其他应用程序时使用的