REST身份验证/授权

13

我需要一些有关如何保护我的应用程序的建议:

我使用Spring MVC 3构建了一个REST服务。

我有一个使用Ext GWT 2.2的客户端应用程序。

用户凭据只在服务器端可用。

SSL可用。

REST服务应仅由已认证的用户使用。

我已阅读有关HTTP摘要,基于令牌的授权,oAuth等方面的信息,但我需要一些澄清和关于如何保护我的应用程序以及在我的情况下哪种方法最好的建议。

1个回答

26

这是我们为应用程序创建的方法论,非常有效且非常安全。

这是一个非常概念性的解释,有很多代码来支持这一点,请注意。

  • 当用户验证或创建帐户时,服务器将返回一个x.509证书,经过base64编码,该证书对于该用户是唯一的。服务器存储一份拷贝。

  • 每次客户端需要访问REST API时,客户端创建一个JSON字符串,包括以下内容:

  • 用户唯一ID(UserID)

  • 一个GUID或UUID,保证此调用是唯一的(CallID)(防止重放攻击)
  • 每个rest调用参数的键值对集合(Dictionary)

然后我们使用x.509公钥加密该字符串,并将其编码回base64字符串,并将此加密值添加到我们称之为token的json对象中的UserID项中。

然后我们把token放到每个调用的header中,例如:X-Auth-UserToken。

在每个调用上,服务器获取令牌,根据userID查找用户证书,然后验证令牌的加密部分是否可以使用服务器持有的用户私钥进行解密。

解密后,服务器接受CallID并根据自己的调用日志数据库验证其是否唯一。

如果验证通过,则用户通过身份验证。

一旦用户经过身份验证,您可以根据用户的唯一ID应用自己的授权规则。

当然,以上全部都是在SSL上进行的。

如果您需要我深入了解任何部分,请告诉我。


太棒了!我一直在寻找这个。 - Mikecito
你可能想看一下WebID http://www.w3.org/wiki/WebID ,这是一个标准化的方式来完成你描述的大部分功能。 - Darrel Miller
2
你是正确的。虽然它可能被认为是多余的,但它非常安全。 :-) - Jason Cragun
你是将每个GUID/UUID存储起来并检查它们之前是否被使用过吗?你会存储多长时间?它们有多“大”,你是如何生成它们的? - x-x
所有的一切都取决于性能和风险,是吗?一个好的Redis存储将表现得相当不错。 - Jason Cragun
显示剩余2条评论

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