ChatGPT解决这个技术问题 Extra ChatGPT

如何验证资源服务器的 OAuth 2.0 访问令牌?

当客户端请求资源服务器获取具有 OAuth 2.0 访问令牌的受保护资源时,该服务器如何验证令牌? OAuth 2.0 刷新令牌协议?

服务器应该能够验证它之前自己发布的令牌......通常这将是数据库查找或加密(自签名令牌)。
我懂了。在这种情况下,资源所有者 WS 和客户端 WS 都在不同的设备上怎么样?
你的意思是认证服务和资源服务? (客户端/消费者将始终在不同的设备上,并且无法自己验证令牌)如果是这种情况,您可以使用“昂贵”的刷新令牌进行检查(只有身份验证服务器可以这样做)但寿命长且频繁过期且可以离线检查的访问令牌。

N
Nielsen

谷歌方式

Google Oauth2 Token Validation

要求:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

回应:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email",
  "expires_in":436
} 

微软方式

Microsoft - Oauth2 check an authorization

Github方式

Github - Oauth2 check an authorization

要求:

GET /applications/:client_id/tokens/:access_token

回应:

{
  "id": 1,
  "url": "https://api.github.com/authorizations/1",
  "scopes": [
    "public_repo"
  ],
  "token": "abc123",
  "app": {
    "url": "http://my-github-app.com",
    "name": "my github app",
    "client_id": "abcde12345fghij67890"
  },
  "note": "optional note",
  "note_url": "http://optional/note/url",
  "updated_at": "2011-09-06T20:39:23Z",
  "created_at": "2011-09-06T17:26:27Z",
  "user": {
    "login": "octocat",
    "id": 1,
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "somehexcode",
    "url": "https://api.github.com/users/octocat"
  }
}

亚马逊方式

Login With Amazon - Developer Guide (Dec. 2015, page 21)

要求 :

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

回复 :

HTTP/l.l 200 OK
Date: Fri, 3l May 20l3 23:22:l0 GMT 
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09 
Content-Type: application/json 
Content-Length: 247 

{ 
  "iss":"https://www.amazon.com", 
  "user_id": "amznl.account.K2LI23KL2LK2", 
  "aud": "amznl.oa2-client.ASFWDFBRN", 
  "app_id": "amznl.application.436457DFHDH", 
  "exp": 3597, 
  "iat": l3ll280970
}

@gustavodiazjaimes它根本没有解释服务器端如何从令牌中识别分配的用户ID。
我不明白所有的赞成票。这似乎无法回答这个问题。
有人知道 Azure Active Directory 是否有类似的端点来检查颁发的令牌是否有效?
换句话说,自己动手。
谷歌似乎已经大大改变了 oauth2 令牌的管理方式,您的网址不再有效。你能更新这个答案吗?
C
Community

2015 年 11 月更新:根据下面的 Hans Z. - 现在确实将其定义为 RFC 7662 的一部分。

原始答案: OAuth 2.0 规范 (RFC 6749) 没有明确定义资源服务器 (RS) 和授权服务器 (AS) 之间的交互以进行访问令牌 (AT) 验证。这实际上取决于 AS 的令牌格式/策略 - 一些令牌是自包含的(如 JSON Web Tokens),而其他令牌可能类似于会话 cookie,因为它们只是引用保存在 AS 的服务器端的信息。

OAuth 工作组中有 some discussion 关于创建 RS 与 AS 进行通信以进行 AT 验证的标准方式。我的公司 (Ping Identity) 为我们的商业 OAuth AS (PingFederate) 提出了一种这样的方法:https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001。它为此使用基于 REST 的交互,这与 OAuth 2.0 非常互补。


Scott T,有没有办法查看有关如何在 Ping Federate 中利用该功能的代码示例?
@JavaHead 在我们的开发人员网站上介绍了更多协议细节:developer.pingidentity.com/en/resources/…,PingFederate OAuth Playground 作为一组 JSP 提供,可以作为验证令牌的源代码引用。它(以及其他开源库和示例)可以从这里下载:developer.pingidentity.com/en/code.html
Scott,我正在寻找一个示例,该示例将演示具有受本地资源服务器保护的 Rest API 和 PingFederate 作为身份验证服务器的客户端凭据授予。然后本地资源服务器将调用验证端点。你遇到过这样的事情吗?
@JavaHead 再次是您应该能够引用 PingFederate OAuth Playground 的东西。它演示了客户端凭据授予类型和资源服务器对访问令牌的验证。
@Gary您是对的,但最终取决于AS的实现和功能。 AS 可能仍然具有撤销访问令牌的能力,在这种情况下,您可能需要回拨以确保已检查。到期和签名检查不会告诉您 AT 仍应被视为有效。
C
Community

@Scott T. 回答的更新:用于令牌验证的资源服务器和授权服务器之间的接口于 2015 年 10 月在 IETF RFC 7662 中标准化,请参阅:https://www.rfc-editor.org/rfc/rfc7662。示例验证调用如下所示:

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 23410913-abewfq.123483

token=2YotnFZFEjr1zCsicMWpAA

和示例响应:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "client_id": "l238j323ds-23ij4",
  "username": "jdoe",
  "scope": "read write dolphin",
  "sub": "Z5O3upPC88QrAjx00dis",
  "aud": "https://protected.example.net/resource",
  "iss": "https://server.example.com/",
  "exp": 1419356238,
  "iat": 1419350238,
  "extension_field": "twenty-seven"
}

当然,供应商和产品的采用必须随着时间的推移而发生。


如果使用 OoenId Connect,我们不应该更喜欢使用 id 令牌验证访问令牌的 openid 方式:openid.net/specs/…
@Renan:与授权请求中请求范围的方式一致,该请求使用 scope 查询参数,其值包含以空格分隔的范围列表
当管理机构尚未正式接受某事时,请不要使用“标准化”一词。截至 2018 年 2 月的 IETF RFC 7662 清楚地表明这是一个“提案”。
@adnankamili 没有“提案”之类的东西。到文档成为 RFC 时,它已经是一个“提议的标准”,在其背后具有重要意义。 OAuth 2.0 本身仍然是一个“提议的标准”,所以我不确定您要表达什么观点。
如果 OAuth 被认为是“3-leg”身份验证,那么这个自省调用会是第 3 个分支吗?我错误地将“第三条腿”归因于客户端调用授权服务器以交换访问令牌的身份验证代码。
F
Flimzy

OAuth 2.0 规范没有定义该部分。但可能有几个选择:

当资源服务器在 Authz Header 中获取令牌时,它会调用 Authz 服务器上的 validate/introspect API 来验证令牌。在这里,Authz 服务器可能会通过使用 DB Store 或验证签名和某些属性来验证它。作为响应的一部分,它解码令牌并发送令牌的实际数据以及剩余的到期时间。 Authz Server 可以使用私钥对令牌进行加密/签名,然后可以将 publickey/cert 提供给资源服务器。当资源服务器获取令牌时,它要么解密/验证签名以验证令牌。取出内容并处理令牌。然后它可以提供访问或拒绝。


J
J.D. Mallen

2021 年更新的答案

通常不建议您自行推出 OAuth 2 / OIDC 实施的任何部分,尤其是现在令牌自省是 part of the standard。就像尝试推出自己的加密库一样,使用如此复杂的规范很容易犯严重错误。

Here's a list 个实施 OAuth 2 的其他语言的推荐库。Here's another 个已通过 OpenID 基金会认证;其中许多库也实现了 OAuth 2。

如果您在 .NET 中并使用 IdentityServer 库(版本 2.2 及更高版本),则 introspect endpoint 完全可以完成此操作。它作为 discovery document(也是 standard)的一部分发布,并且是资源服务器可以验证访问令牌的端点。

如果您已经走到了这一步,但仍然真的想自己动手,请从 how the bigger libraries have done it 那里获得一些提示。


F
Flimzy

OAuth v2 规范表明:

访问令牌属性和用于访问受保护资源的方法超出了本规范的范围,由配套规范定义。

我的授权服务器有一个 Web 服务 (SOAP) 端点,允许资源服务器知道 access_token 是否有效。