我正在设计一个 RESTful Web 服务,需要被用户访问,但也有其他 Web 服务和应用程序。所有传入的请求都需要进行身份验证。所有通信都是通过 HTTPS 进行的。用户身份验证将基于身份验证令牌进行工作,该令牌通过将用户名和密码(通过 SSL 连接) POST 到服务提供的 会议资源获得。
在 Web 服务客户端的情况下,客户端服务后面有 没有终端用户。这些请求是由预定的任务、事件或其他计算机操作发起的。连接服务的列表是预先知道的(显然,我猜)。我希望这些服务的身份验证过程尽可能简单,但不能以牺牲安全为代价。这种情况下的标准和最佳实践是什么?
我能想到的(或者已经有人向我建议过的)选项:
让客户服务使用“假”用户名和密码,并以与用户相同的方式进行身份验证。我不喜欢这个选择,感觉不对。
为客户端服务分配一个永久的应用程序 ID,可能还有一个应用程序密钥。据我所知,这和用户名 + 密码是一样的。使用这个 id 和密钥,我可以对每个请求进行身份验证,或者创建一个身份验证令牌来对进一步的请求进行身份验证。无论哪种方式,我都不喜欢这个选项,因为任何能够获得应用程序 ID 和密钥的人都可以模拟客户机。
I could add an IP address check to previous option. This would make it harder to perform fake requests.
客户证明。建立我自己的证书颁发机构,创建根证书,并为客户端服务创建客户端证书。不过,我想到了几个问题: a)如何仍然允许用户在没有证书的情况下进行身份验证; b)从客户端服务的角度来看,实现这个场景有多复杂?
一定还有其他的解决方案吧
我的服务将运行在 Java 上,但是我故意遗漏了关于它将建立在什么样的具体框架上的信息,因为我对基本原则更感兴趣,而不是对实现细节那么感兴趣——我假设这方面的最佳解决方案将是可能实现的,而不管底层框架是什么。然而,我对这个主题有点缺乏经验,因此关于实际实现的具体提示和示例(例如有用的第三方库、文章等)也会受到很大的欢迎。