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 中使用