RESTful Web 服务中的身份验证

Posted

技术标签:

【中文标题】RESTful Web 服务中的身份验证【英文标题】:Authentication in a RESTful web-service 【发布时间】:2012-06-19 20:43:40 【问题描述】:

我正在构建一个基于 Spring 的宁静 Web 服务。我正在使用 Spring 安全性。它只能由桌面应用程序访问。基本上是机器对机器的网络服务。

我想要一个进行身份验证的自定义服务。然后根据身份验证的结果执行其他更敏感的操作。

另一种选择是在每个请求的正文中发送凭据,基本上每次都进行身份验证。

逻辑认为,第一种方法将是最有效的,因为每次进行身份验证都会产生相当多的开销。

您对此有何建议?去无状态还是有状态?有状态方法是否存在主要缺点?

到目前为止,我阅读了Java Web Services Up and Running的一些章节 还有来自 SO 的几个问题,例如this。

【问题讨论】:

【参考方案1】:

执行此操作的 REST 方法是,如您提供的链接中所述,对每个请求进行身份验证,而不是保留会话。

至于在每个请求上使用用户名/密码进行身份验证,如果您可以使用......安全层(https)是安全的;否则,该对以明文形式发送且可被发现。

另一种选择是使用类似 AWS 的方式来执行此操作(例如,链接到 Amazon here 和 here)。这里有其他解释:buzzmedia和samritchie

也许 OAuth 是一种选择,但我没有这方面的经验。

【讨论】:

所以这更像是 REST Web 服务内部的安全设计模式。我的问题是:这不是更慢,效率更低吗?在基于 SOAP 的 Web 服务中,我不知道一些避免会话的建议。完全无国籍有明显的优势吗?谢谢! 至于性能:我会说计算哈希所需的几条指令,或者为身份验证信息传输的几个字节与整体传输和请求处理时间相比是无关紧要的。 是的,请求处理时间可能是个问题。我的意思是,每次传入凭据时,都必须进行数据库查找以对用户进行身份验证。 再次:与网络传输时间相比,现代数据库请求需要多长时间?我的猜测:几乎没有。我首先会以 REST 方式正确地执行此操作。然后,如果它很慢,请进行分析以查看瓶颈是什么。它很可能不是身份验证的一个数据库请求。如果它在哪里,请尝试优化。以前没有。【参考方案2】:

从 REST 服务(客户端 - 服务器)开始,我强烈建议您使用 Restlet

可以使用ClientResource 定义对此 REST 服务的身份验证。示例:

private static ClientResource getClientResource(String uri) 
ClientResource clientResource = new ClientResource(uri);
clientResource.setChallengeResponse(ChallengeScheme.HTTP_BASIC,
        "username", "password"
        );
return clientResource;

【讨论】:

虽然我很欣赏这个建议,但我想知道在保护 REST Web 服务时,发送每个请求的用户名和密码是否是一个可行的选择。谢谢! 您可以通过登录资源进行身份验证,然后只需检查每个请求的 cookie。至少我们是这样做的

以上是关于RESTful Web 服务中的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

访问 RESTful Web 服务的最佳身份验证机制

Web服务器上的RESTful身份验证

ASP.net Web API RESTful Web 服务 + 基本身份验证

Spring RESTful Web 服务身份验证

WCF、RESTful Web 服务和自定义身份验证

如何为 Spring Boot RESTful Web 服务配置多级身份验证?