2-legged oauth 在 OAuth 2.0 中如何工作?

Posted

技术标签:

【中文标题】2-legged oauth 在 OAuth 2.0 中如何工作?【英文标题】:How does 2-legged oauth work in OAuth 2.0? 【发布时间】:2012-12-24 09:29:21 【问题描述】:

在 OAuth 1.0 中,2-legged 非常容易:只需像往常一样发送请求并省略 access_token 标头。

OAuth 2.0 中的情况似乎发生了变化(正如我今天发现的那样:))。在 OAuth 2.0 中,请求不再有诸如 nonce、consumer key、timestamp 等标头。这只是替换为:

Authorization: OAuth ya29.4fgasdfafasdfdsaf3waffghfhfgh

我了解在 OAuth 2.0 和应用程序流程中如何使用 3 项授权。但是 2-legged 在 2.0 中是如何工作的呢?是否可以设计一个同时支持 2-legged 和 3-legged OAuth 2.0 的 API?

我一直在搜索这方面的信息,但我在 1.0 的 2-legged 上找到了很多东西,而在 2.0 上几乎没有。

【问题讨论】:

同意你的观点,对于 3-legged oauth2.0 或 2-legged oauth 1.0 有足够的信息,但对于 2-legged oauth 2.0 几乎没有任何信息。 【参考方案1】:

经过大量研究,我发现client_credentials 授权类型适用于这种情况。将这个术语输入 google 后,您会发现大量非常有用的资源。

这是 3-legged OAuth 2.0 的正常流程(我们希望用户登录):

假设我们的应用中有以下端点用于身份验证:

/oauth/auth

/oauth/token

通常(对于授权码授予),我们将用户定向到/oauth/auth?state=blah&client_id=myid&redirecturl=mysite.com/blah

然后在认证后,用户被重定向到mysite.com/blah?code=somecode

然后我们得到somecode 并使用/oauth/token?code=somecode&client_id=myid&client_secret=mysecret 将其交换为令牌

然后我们可以使用令牌进行调用。


这是client_credentials 实现 2-legged OAuth 2.0 的应用流程,明显更简单:

在这种方法中,我们不需要执行任何身份验证。

我们只需使用以下表单数据 POST 到 /oauth/token

 grant_type=client_credentials&scope=view_friends

请注意,范围是可选的。然后端点直接返回一个访问令牌供我们使用(不提供刷新令牌)。由于没有提供刷新令牌,因此当令牌过期时,您需要重新进行身份验证并请求新的。

这导致以下警告:

仅将其用于(非常)受信任的应用程序,例如内部应用程序。 您需要设计自己的身份验证方式。例如,RFC's example 使用基本身份验证。

另一种解决方案是使用 JWT(JSON Web 令牌),例如 google OAuth API。这是一个非常复杂的过程,但是存在许多用于生成 JWT 的库。然后发布以下表单数据(当然是 url 编码):

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=generated_jwt

这已发布到/oauth/token 以获取您的令牌。


关于是否可以创建支持2-legged和3-legged OAuth 2.0的API的问题,可以

那么/auth 端点仅在用户需要对服务进行身份验证时使用。

/token 端点中,只需检查urn:ietf:params:oauth:grant-type:jwt-bearer 的GET 参数中grant_type 的值(如果使用JWT 或client_credentials 用于client_credentials)。

请注意,在生成要提供给用户的 client_id 和 client_secret 时,如果您支持多个 grant_types,请确保您有一个数据库列来存储为什么类型的授权类型生成 id 和 secret。如果需要为每个用户提供多种授权类型,请为每种授权类型生成一组不同的凭据。

【讨论】:

如果您愿意,还可以查看 Google 的实施。例如,这里记录了开发人员的体验:developers.google.com/drive/delegation 是的,基本上使用客户端凭据和您委派域范围访问权限的特殊“服务帐户”。 您好 Nivco,我正在从事与 Google API 相关的项目,但没有找到有关 2-legged oauth 2.0 的足够信息/知识。您上面的链接确实有帮助,但是,我的问题是:Google 日历 api、google 联系人 api 和 gmail IMAP XOAUTH 怎么样?他们支持 2-legged oauth2 吗?谢谢 有关 Google 2-legged OAuth2 实施的更多信息,您还可以查看以下链接:developers.google.com/accounts/docs/OAuth2ServiceAccount。此外,所有 Google API(包括日历、联系人等)都支持通过 Google 的 2-legged OAuth2 获得的访问令牌,有关此方面的更多信息,请参阅***.com/questions/20127114/…。希望对您有所帮助。【参考方案2】:

您还可以查看 Google 对 2-legged OAuth2 的实现(我相信该文档最近才发布)。

Google Drive SDK delegation docs 还应该有助于理解 Google 的 2-legged OAuth2 实施。

【讨论】:

以上是关于2-legged oauth 在 OAuth 2.0 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 中使用 OAuth2.0 2-legged 方法访问 Jira API

带有 2-legged OAuth 的 Gmail atom 提要收到 401 错误

实现 2-legged OAuth 以获取用户特定数据以在 Javascript 中使用

Spring-OAUTH2.0:调用 /oauth/token 时没有可用资源错误

Oauth 2 - 参数排序和签名完整性

Spring security oauth 2 和客户端凭据流