我有一个 Restful Web 服务 API,正在被不同的第 3 方使用。该 API 的一部分受到限制(您需要用户名/密码才能访问它)。我想知道实施身份验证的最佳方法是什么?
我使用的是 https,因此通信是加密的。我有两个想法:
- 在用户开始使用(受限)服务之前,它使用 POST 发送用户名/密码(因为使用 https 凭据已加密)。登录成功后,服务器发送回与该用户名匹配的随机单次使用值(nonce)。当发出下一个请求时,客户端会连同用户名一起发送之前返回的随机数。服务器匹配用户名和随机数,并返回新的随机数以及请求的数据。每个新请求都使用新的随机数。基本上,这是摘要式访问身份验证的轻量级版本。
- 由于此 API 是从第 3 方使用的,因此每个(受限)请求都可以使用用户名/密码。由于使用 https,它们将被加密。这种方法的缺点是它不符合 Restful 标准(始终使用 POST)。
我更倾向于选择第一种方法(它符合 Restful 标准,相对容易实现,可以使用 XML、json 或 html,无需更改任何内容),但我想看看您的意见是什么?您建议什么:第一种、第二种还是第三种方法?
顺便说一句,我在服务器端使用Python。
我在 API 中看到的一种方法(以及当前实现它的方法)是创建一个名为的 RESTful 资源Session这是通过创建POST它提供用户名和密码。
这基本上是我的实现方式:
POST /sessions { Username: "User", Password: "Password" }
创建一个限时会话并返回包含会话密钥值和过期时间的会话资源。您可能还希望将其作为 cookie 值返回,以方便 API 客户端的实现。
DELETE /session/{id}
会话立即过期,因此无法再使用。这用于显式退出。
然后,我让用户通过查询参数附加会话密钥,尽管您也可以允许通过 cookie 值提交它,但我建议允许两者都允许。
我更喜欢这个的是它非常简单。
显然,您的场景将在某种程度上决定您的会话应该如何管理,也许它们没有时间限制并且无限期地持续,并且也许它们被散列或加密以增加安全性。
如果您在任何地方都使用 HTTPS,您可能不需要太担心。但是,如果您想使用 HTTP,则需要使用哈希之类的内容以及密钥,并指定时间戳来为每个请求生成安全密钥。这样您就可以通过 HTTPS 共享密钥,然后切换到 HTTP 进行进一步的调用。即使有人设法从请求中嗅出密钥,它也几乎会立即过期并且毫无用处。
免责声明:我不是安全专家;-)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)