【问题标题】:RESTful authentication schemeRESTful 认证方案
【发布时间】:2011-12-30 05:07:15
【问题描述】:

我需要为 RESTful 架构实施身份验证方案。从我读过的几篇文章中,包括使用 HTTPs 的基本身份验证和使用 Cookie 的会话管理。

但是我不太了解 cookie 的使用。我的理解是用户首先发送凭据。服务器检查凭据是否正常。如果是,服务器会生成一个授权令牌并将其放入 cookie 中。之后,对于每个请求,服务器都会检查 cookie 中令牌的有效性。

但是服务器如何知道cookie的内容是有效的。它是否将其存储在某个地方,然后进行比较??

【问题讨论】:

    标签: rest restful-authentication


    【解决方案1】:

    这里的关键点是授权令牌。当生成一个并发送回客户端时,您将身份验证令牌与用户名一起存储在一个数据库中。您将身份验证令牌存储在 cookie 中。后续请求的客户端会向您发送用户名和包含身份验证令牌的 cookie。您根据提供的用户名验证此令牌,然后根据需要执行操作。

    但是,请注意,设置 cookie 会使您的 Web 服务调用有状态并违背 REST 的目的。

    要实现身份验证/授权,不要在 cookie 中设置授权令牌,而是将其作为响应值发送回来。客户端读取身份验证令牌的值,然后在每个 REST 请求中提供相同的值作为请求正文的参数。因此,您无需设置 cookie。您可以将其称为在基于 OAuth 的 API 访问中实现的内容的简化和更简单的版本。

    【讨论】:

    • 服务器发回token给客户端的时候,客户端会把它存储在某个地方,但这不是风险吗??另外,如果每次我们都将网络上的令牌传输到服务器,是否没有人拦截请求的风险??
    • 客户端将令牌存储在内存中,这与将任何其他值存储在内存(或浏览器 cookie)中一样安全。通过网络传输令牌具有与传输 cookie 相同的安全问题(如问题陈述中所述)。所有这些限制都已在基于 OAuth 的 API 访问中得到解决。它本质上意味着使用 SHA1/MD5 使用身份验证令牌对请求参数进行签名,并将校验和作为另一个参数包含在内。由于服务器知道身份验证令牌,它可以重新计算校验和并将其与提供的校验和匹配。
    • 因此身份验证令牌不会传输回客户端。仅提供用户名以及使用令牌计算的校验和。令牌可能被破坏的唯一地方是在授权期间从服务器到客户端的传输过程中 - 因此,通过 HTTPS 使用它更安全。
    【解决方案2】:

    我不是专家,但理解这一点的一个很好的起点是 Hartl 书中的 section on Sessions

    如果我没记错的话,它的工作原理如下:
    创建令牌时,它使用公式,例如用户名和唯一的用户密钥(盐)一起加密。用户名和 salt 都存储在数据库中,并且 salt 对于该用户是唯一的。因此,就像您比较密码是否匹配一样,要检查 cookie 的有效性,您需要重新创建令牌并将其与 cookie 中的令牌进行比较。如果匹配,则正确的用户已登录并因此获得授权。

    希望这会有所帮助,或者至少为您指明正确的方向:)

    【讨论】:

    • 如果我们每次在 cookie 中发送令牌,你认为这会导致安全威胁吗??
    • 如上所述(在我的评论中),将令牌再次发送回服务器绝对是一个安全问题,应使用 HTTPS 协议将其最小化。
    • 好吧,我不知道我是否会将它用于银行系统,但如果每次登录都使用唯一的数字(例如时间戳)来创建令牌,即使有人偷了它,系统将不允许“小偷”登录,因为时间戳会不同。对于大多数情况,所描述的方法应该足够安全。如果您有点偏执,请尝试在数据库中保存会话而不是 cookie。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多