我正在设计一个RESTful Web服务,需要用户以及其他Web服务和应用程序访问。所有传入的请求都需要进行身份验证。所有通信都通过HTTPS进行。用户身份验证将基于身份验证令牌工作,通过将用户名和密码(通过SSL连接)POST到服务提供的/session资源来获取。
对于Web服务客户端,客户端服务后面没有终端用户。请求是由计划任务、事件或其他计算机操作发起的。连接服务的列表是预先知道的(显然,我想)。我应该如何验证来自其他(Web)服务的这些请求?我希望身份验证过程对这些服务的实现越简单越好,但不能以安全为代价。像这样的情况有哪些标准和最佳实践呢?
我能想到的选项(或者别人建议给我的):
让客户端服务采用“虚假”的用户名和密码,并以与用户相同的方式进行身份验证。我不喜欢这个选项——它感觉不对。
为客户端服务分配永久的应用程序ID,可能还包括应用程序密钥。就我所理解的而言,这与具有用户名+密码的情况完全相同。通过此ID和密钥,我可以验证每个请求,或者创建身份验证令牌来验证进一步的请求。但问题是,任何能够获取应用程序ID和密钥的人都可以冒充客户端。
我可以在前面的选项中添加IP地址检查。这将使虚假请求更难实现。
客户端证书。设置自己的证书颁发机构,创建根证书,并为客户端服务创建客户端证书。然而,有几个问题需要考虑:a)如何使用户无需使用证书进行身份验证?b)从客户端服务的角度来看,这种情况有多复杂?
其他解决方案——肯定还有其他解决方案吧?
我的服务将在Java上运行,但我故意省略了它将建立在哪个具体框架上的信息,因为我更关注基本原则而不是具体实现细节 - 我认为无论底层框架如何,都可以实现最佳解决方案。然而,我对这个主题有些缺乏经验,因此实际实现方面的具体提示和示例(例如有用的第三方库、文章等)也将非常感激。