【发布时间】:2011-09-02 07:23:46
【问题描述】:
我正在设计一个需要用户访问的 RESTful Web 服务,以及其他 Web 服务和应用程序。所有传入的请求都需要进行身份验证。所有通信都通过 HTTPS 进行。用户身份验证将基于身份验证令牌工作,该令牌通过将用户名和密码(通过 SSL 连接)发布到服务提供的 /session 资源来获取。
在 Web 服务客户端的情况下,客户端服务背后没有最终用户。请求由计划任务、事件或其他一些计算机操作发起。连接服务列表是事先知道的(显然,我猜)。 我应该如何对来自其他(网络)服务的这些请求进行身份验证?我希望为这些服务实施身份验证过程尽可能简单,但不以牺牲安全为代价。对于这样的场景,标准和最佳做法是什么?
我能想到(或已向我建议)的选项:
让客户端服务使用“假”用户名和密码,并以与用户相同的方式对其进行身份验证。我不喜欢这个选项 - 它只是感觉不对。
为客户端服务分配一个永久的应用程序 ID,也可能是一个应用程序密钥。据我了解,这与拥有用户名+密码相同。使用这个 id 和密钥,我可以对每个请求进行身份验证,或者创建一个身份验证令牌来对进一步的请求进行身份验证。无论哪种方式,我都不喜欢这个选项,因为任何可以获取应用程序 ID 和密钥的人都可以冒充客户端。
我可以在之前的选项中添加 IP 地址检查。这将使执行虚假请求变得更加困难。
客户端证书。设置我自己的证书颁发机构,创建根证书,并为客户端服务创建客户端证书。不过,我想到了几个问题:a) 我如何仍然允许用户在没有证书的情况下进行身份验证,以及 b) 从客户端服务的角度来看,这种场景的实现有多复杂?
其他的 - 肯定有其他解决方案吗?
我的服务将在 Java 上运行,但我故意遗漏了有关它将建立在什么特定框架上的信息,因为我对基本原理更感兴趣,而不是对实现细节感兴趣 - 我假设最好的解决方案因为无论底层框架如何,这都可以实现。但是,我对这个主题有点缺乏经验,所以关于实际实现的具体提示和示例(如有用的第三方库、文章等)也将不胜感激。
【问题讨论】:
-
如果我可以建议,请熟悉大型网站服务并选择您喜欢的内容。您的用户还会发现与其他 RESTful 服务的最佳实践有相似之处。
-
发现另一个涉及类似主题的问题(大约两年前):stackoverflow.com/questions/1138831/…
-
服务(网络和其他)托管在什么操作系统上?它们是否在属于同一基础架构的服务器上运行?
-
操作系统可能会有所不同:Win、*nix 等。客户端服务可能与我的服务在同一基础架构内,也可能不在。
标签: web-services authentication rest restful-authentication client-certificates