当客户机请求资源服务器获取具有 OAuth 2.0访问令牌的受保护资源时,该服务器如何验证令牌?OAuth 2.0刷新令牌协议?
根据下面汉斯 Z 的说法-这现在确实被定义为 RFC 7662的一部分。
OAuth 2.0规范(RFC 6749)没有明确定义资源服务器(RS)和授权服务器(AS)之间用于访问令牌(AT)验证的交互。它实际上取决于 AS 的令牌格式/策略——一些令牌是自包含的(如 JSON Web 令牌) ,而其他的令牌可能类似于会话 cookie,因为它们只是引用 AS 服务器端保存的信息。
在 OAuth 工作组中有一个 讨论一下,是关于创建 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的很好补充。
OAuth v2规范指出:
访问令牌属性和用于访问受保护资源的方法超出了本规范的范围,由相关规范定义。
我的授权服务器有一个 webservice (SOAP)端点,允许资源服务器知道 access _ token 是否有效。
谷歌 Oauth2令牌验证
要求:
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检查授权
Github-Oauth2检查授权
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" } }
用亚马逊开发者指南登录(2015年12月,第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 }
关于@Scott T 的回答的更新: 2015年10月 IETF RFC7662标准化了资源服务器和授权服务器之间的令牌验证接口,参见: 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" }
当然,供应商和产品的采用将随着时间的推移而发生。
OAuth 2.0规范没有定义这个部分,但是可能有几个选项:
当资源服务器在 Authz Header 中获取令牌时,它将在 Authz 服务器上调用验证/内省 API 来验证令牌。在这里,Authz 服务器可以通过使用 DB 存储或验证签名和某些属性来验证它。作为响应的一部分,它对令牌进行解码,并发送令牌的实际数据以及剩余的到期时间。
Authz Server 可以使用私钥对令牌进行加密/签名,然后可以将公钥/证书给予资源服务器。当资源服务器获取令牌时,它要么解密/验证签名以验证令牌。取出内容并处理令牌。然后它可以提供访问或拒绝。
通常不建议您自己滚动 OAuth 2/OIDC 实现的任何部分,特别是现在令牌内省是 标准的一部分。就像尝试滚动您自己的加密库一样,使用如此复杂的规范很容易出现严重错误。
实现 OAuth 2的其他语言的推荐库的 这是名单。那些已经通过 OpenID 基金会认证的库的 还有一个; 其中许多库也实现了 OAuth 2。
如果你愿意的话。NET 和使用 IdentityServer 库(版本2.2和更高版本) ,自省端点自省端点完全实现了这一点。它作为 发现文件(也是 标准)的一部分发布,并且是资源服务器可以验证访问令牌的端点。
如果你已经走了这么远,你仍然想滚自己的 真的,采取一些技巧从 大型图书馆是如何做到这一点的。