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

Ack*_*Ack 135 oauth oauth-2.0

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

小智 119

谷歌的方式

Google Oauth2令牌验证

请求:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg
Run Code Online (Sandbox Code Playgroud)

响应:

{
  "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
} 
Run Code Online (Sandbox Code Playgroud)

Github的方式

Github - Oauth2检查授权

请求:

GET /applications/:client_id/tokens/:access_token
Run Code Online (Sandbox Code Playgroud)

响应:

{
  "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"
  }
}
Run Code Online (Sandbox Code Playgroud)

亚马逊方式

使用Amazon登录 - 开发人员指南(2015年12月,第21页)

要求:

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...
Run Code Online (Sandbox Code Playgroud)

回应:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白所有的选票.这似乎没有回答这个问题. (15认同)
  • @gustavodiazjaimes它根本没有解释服务器端如何识别来自令牌的已分配用户ID. (2认同)
  • 有人知道 Azure Active Directory 是否有类似的端点来检查颁发的令牌是否有效? (2认同)
  • 换句话说,自己动手。 (2认同)

Sco*_* T. 91

201511月更新 - 按照下面的Hans Z. - 现在确实已经定义为RFC 7662的一部分.

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

OAuth工作组已经讨论了如何为RS与AS通信进行AT验证创建标准方法.我的公司(Ping Identity)为我们的商业OAuth AS(PingFederate)提出了一种这样的方法:https://documentation.pingidentity.com/pingfederate/pf/index.shtml#concept_grantTypeParameters.html#concept_grantTypeParameters (请参阅访问令牌验证)授予类型).它使用基于REST的交互,这与OAuth 2非常互补.

-

  • @JavaHead我们的开发者网站上提供了更多协议详细信息:https://developer.pingidentity.com/en/resources/oauth-2-0-developers-guide.html#validate_token.<br/> <br此外,PingFederate OAuth Playground作为一组JSP提供,可以作为验证令牌的源代码引用.它(以及其他开源库和示例)可以从这里下载:https://developer.pingidentity.com/en/code.html (2认同)

Han*_* Z. 49

@Scott T.答案的更新:资源服务器和授权服务器之间用于令牌验证的接口在2015年10月的IETF RFC 7662中标准化,请参阅:https://tools.ietf.org/html/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
Run Code Online (Sandbox Code Playgroud)

和样品回复:

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"
}
Run Code Online (Sandbox Code Playgroud)

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

  • @adnankamili 没有“提案”这样的东西。当一个文档成为 RFC 时,它已经是一个“提议的标准”,在其背后具有重要意义。OAuth 2.0 本身仍然是一个“提议的标准”,所以我不确定你想表达什么观点。 (4认同)
  • 如果管理机构未正式接受某些内容,请不要使用"标准化"一词.截至2018年2月的IETF RFC 7662清楚地表明它是一个"提案". (3认同)

dvs*_*gec 12

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

  1. 当资源服务器在Authz Header中获取令牌时,它会调用Authz服务器上的validate/introspect API来验证令牌.在这里,Authz服务器可以通过使用DB Store或验证签名和某些属性来验证它.作为响应的一部分,它解码令牌并发送令牌的实际数据以及剩余的到期时间.

  2. Authz Server可以使用私钥对令牌进行加密/签名,然后可以将publickey/cert提供给Resource Server.当资源服务器获取令牌时,它会解密/验证签名以验证令牌.获取内容并处理令牌.然后它可以提供访问或拒绝.


J.D*_*len 11

2021 年更新答案

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

以下是实现 OAuth 2 的其他语言的推荐库列表。这是另一个已通过 OpenID 基金会认证的库;其中许多库也实现了 OAuth 2。

如果您使用 .NET 并使用 IdentityServer 库(版本 2.2 及更高版本),内省端点恰好可以完成此任务。它作为发现文档(也是标准文档)的一部分发布,并且是资源服务器可以验证访问令牌的端点。

如果您已经走到了这一步,但您仍然推出自己的产品,请从大型图书馆的做法中获取一些技巧。


Car*_* AG 8

OAuth v2规范指出:

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

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