使用 OAuth 进行服务器到服务器身份验证?

Posted

技术标签:

【中文标题】使用 OAuth 进行服务器到服务器身份验证?【英文标题】:Using OAuth for server-to-server authentication? 【发布时间】:2010-10-21 01:44:31 【问题描述】:

我目前正在努力指定我公司的新合作伙伴/公共 API,这将是一个面向资源的 RESTful Web 服务。目前缺少的难题是身份验证/授权。

要求是:

    最初它必须适用于服务器到服务器的环境,例如服务器应用程序必须能够识别自己,以便我们知道谁在调用 API。 将来,我们希望允许它模拟用户帐户,以便在识别服务器的同时,它会有一个在有限时间内代表用户帐户的令牌。

OAuth 似乎非常适合 (2) 的工作流程,即获取令牌、重定向到用户输入其凭据以对其进行授权的网站,然后使用该令牌来识别/验证应用程序和用户。

但是,根据我的阅读,我不知道它是否适合 (1) - 即有没有什么方法可以使用 OAuth 只是 来识别调用应用程序而无需一个有效的用户特定令牌,因此不需要重定向到网页让他们输入他们的凭据?

【问题讨论】:

【参考方案1】:

实际上有两种 OAuth 规范,3-legged 版本和 2-legged 版本。三足版本是最受关注的版本。

2-legged 版本完全符合您最初的要求,它允许应用程序通过共享密钥授予对另一个应用程序的访问权限(非常类似于 Amazon 的 Web 服务模型,您将使用 HMAC-SHA1 签名方法)或通过公钥/私钥系统(使用签名方法:RSA-SHA1)。坏消息是,它还没有像 3-legged 版本那样得到很好的支持,所以你现在可能需要做更多的工作。

基本上,2-legged OAuth 只是指定一种“签名”(计算哈希)几个字段的方法,这些字段包括当前日期、一个称为“nonce”的随机数以及您的请求参数。这使得模拟对您的 Web 服务的请求非常困难

OAuth 正在缓慢但肯定会成为此类事情的公认标准 - 从长远来看,如果你接受它,你会得到最好的结果,因为人们可以利用各种可用的库来做到这一点。

让 2 条腿和 3 条腿同时工作现在有点棘手 - 但它是可能的(谷歌现在可以工作)。 http://code.google.com/apis/accounts/docs/OAuth.html

【讨论】:

【参考方案2】:

格雷格:

我一直在研究 OAuth 核心的扩展,我认为它可能会满足您的需求。我们想针对我们自己的 API 编写应用程序,但我们认为不允许我们自己的应用程序(作为服务提供者)直接从用户/消费者应用程序收集凭据没有多大意义——因为我们已经被认为是受信任的参加我们自己的聚会。

该扩展允许第一方、第二方,当然还有第三方(传统的 OAuth),同时使用协议提供的令牌和机密以及签名等安全性。

可以在here 找到我们关于扩展的测试版文档。

【讨论】:

【参考方案3】:

如果只是关于服务器到服务器的通信,我会考虑使用基于 API 密钥的授权 - 就像 bit.ly 或 FriendFeed。

【讨论】:

能写更多关于它的内容吗? OAuth 基于 API 密钥(名称不同)。【参考方案4】:

是的,令牌的生命周期可以设置为不过期,直到你说出来。因此,您将(手动)完成身份验证和授权,并保存授权令牌以供以后使用。

(您可以使用any test client 来帮助您完成该手动部分,或者在您自己实现服务器时:使用所谓的双腿 OAuth。)

【讨论】:

2-legged OAuth 看起来很有希望...如果结果证明是我需要的,我会研究一下并将其标记为正确答案。 请注意,OAuth 还确保请求不会被篡改(在不使用 HTTPS 时也是如此)。 @Arjan 你能描述一下 OAuth 在不使用 HTTPS 时如何确保请求不会被篡改吗? @sank,我假设我的意思是“OAuth 请求”(而不是使用 OAuth 令牌的后续其他请求)。但即便如此,我也不知道我为什么要写那个...... :-(

以上是关于使用 OAuth 进行服务器到服务器身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OAuth2/OpenId Connect 和微服务进行身份验证和授权

如何进行应用程序到应用程序(服务器到服务器)身份验证、OAuth 2.0、Web API 2.0

通过 OAuth 对 Google API 进行经过身份验证的调用时遇到问题

如何使用 oauth2 通过 REST Web 服务进行身份验证

Spring Cloud OAuth2:身份验证后再次重定向到登录页面,就像使用表单登录时未经身份验证一样

如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?