| RFC 9101 | OAuth JAR | 2021年8月 |
| Sakimura 等 | 标准轨道 | [页] |
RFC 6749 中描述的 OAuth 2.0 授权请求采用 查询参数序列化,这意味着授权请求 参数被编码在请求的 URI 中,并通过诸如 Web 浏览器之类的用户 代理发送。虽然这很容易实现,但这意味着 a) 通过用户代理进行的通信没有受到完整性 保护,因此参数可能被篡改,b) 通信的来源 未经身份验证,以及 c) 通过用户代理进行的通信 可能受到监视。由于这些弱点, 目前已经提出了多种针对该协议的攻击。¶
本文档引入了改用 JSON Web Token (JWT) 发送请求参数的能力,从而允许使用 JSON Web Signature (JWS) 对请求进行签名,并使用 JSON Web Encryption (JWE) 对其进行加密,以便 获得授权请求的完整性、来源身份验证和机密性 属性。请求可以 按值或按引用发送。¶
这是一份互联网标准轨道文档。¶
本文档是互联网工程任务组 (IETF) 的产物。它代表了 IETF 社区的共识。本文档已经 接受公开审查,并经 互联网工程指导组 (IESG) 批准发布。有关 互联网标准的更多信息,请参阅 RFC 7841 第 2 节。¶
有关本文档的当前状态、任何 勘误以及如何提供反馈的信息,可从 https://www.rfc-editor.org/info/rfc9101 获取。¶
Copyright (c) 2021 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.¶
OAuth 2.0 [RFC6749] 中的授权请求 采用查询参数 序列化,并且通常通过诸如 Web 浏览器之类的用户代理发送。¶
例如,参数 response_type、client_id、state 和
redirect_uri 被编码在请求的 URI 中:¶
虽然这很容易实现,但 URI 中的编码 不允许使用应用层安全机制来 提供机密性和完整性保护。 虽然 TLS 用于在客户端与用户代理之间以及用户代理与 授权服务器之间提供通信安全, 但 TLS 会话终止于用户代理。 此外,TLS 会话可能会 在某些中间设备(例如负载均衡器)处提前终止。¶
由于这些固有弱点,已经发现了多种针对该 协议的攻击,例如重定向 URI 重写。¶
使用应用层安全机制可以缓解这些问题。¶
使用应用层安全机制允许由 受信任的第三方准备请求,从而使客户端应用程序无法请求超出 先前约定范围的权限。¶
此外,按引用传递请求可以减少网络传输开销。¶
参数 request 和 request_uri
被引入作为 OAuth 2.0 [RFC6749] 流程的附加授权请求参数。
request 参数
是一个 JSON Web Token (JWT) [RFC7519],其 JWT 声明
集包含经过 JSON 编码的 OAuth 2.0 授权请求参数。
请注意,与 RFC 7519 不同,声明集的元素是
经过编码的 OAuth 请求参数 [IANA.OAuth.Parameters],
并且仅补充了少数由 IANA 管理的 JSON Web Token 声明
[IANA.JWT.Claims],特别是 iss
和
aud。request 参数中的 JWT 使用 JWS 进行完整性
保护和来源身份验证。¶
JWT [RFC7519] 可以
按引用传递给授权端点,
在这种情况下使用参数 request_uri
而不是 request。¶
使用 JWT [RFC7519] 作为请求编码而不是查询 参数具有以下几个优点:¶
在一些情况下,按引用请求很有用,例如:¶
OpenID Connect [OpenID.Core] 正在使用此功能。¶
本文档中的关键词“必须”、“不得”、 “必需”、“应”、“不应 ”、“应该”、“不应该”、 “建议”、“不建议”、 “可以”和“可选” 仅当它们如本文所示以全大写形式出现时, 才应按照 BCP 14 [RFC2119] [RFC8174] 中的说明进行解释。¶
就本规范而言,除 OAuth 2.0 框架 [RFC6749]、 JSON Web 签名 [RFC7515] 和 JSON Web 加密 [RFC7516] 中定义的内容之外,还适用以下术语和 定义。¶
请求对象是一个 JSON Web Token (JWT) [RFC7519],其 JWT 声明 集包含经过 JSON 编码的 OAuth 2.0 授权请求 参数。¶
请求对象 URI 是一个绝对 URI,它引用构成
OAuth 2.0 授权请求的一组参数。该 URI 所引用
资源的内容是一个 请求
对象(第 2.1 节),除非该
URI 是由同一授权服务器提供给客户端的,在这种情况下,
其内容属于由
授权服务器自行决定的实现细节。要求内容为请求对象,是为了确保在
request_uri 的提供者与消费者是不同
实体的情况下实现互操作性,例如客户端提供一个 URI,
该 URI 引用存储在客户端后端服务上的请求对象,
并通过 HTTPS 使其可访问。在后一种情况下,即
授权服务器既是该 URI 的提供者又是消费者,例如
它提供一个端点,用请求对象换取一个
URI 时,则不存在这种互操作性问题。¶
客户端通过使用 application/x-www-form-urlencoded
格式将以下参数添加
到授权端点 URI 的查询
组件中,来构造授权请求 URI:¶
request_uri,否则必需。
保存 第 4 节([RFC6749])(OAuth 2.0)中所述
授权请求参数的 请求对象(第 2.1 节)。
如果授权请求中存在此参数,
则不得存在 request_uri。¶
request,否则必需。
由 RFC 3986 [RFC3986] 定义的绝对 URI,它是引用
第 4 节([RFC6749])(OAuth
2.0)中所述授权请求
参数的 请求对象 URI(第
2.2 节)。
如果授权请求中存在此参数,
则不得存在 request。¶
client_id。该值必须与
request 或 request_uri
请求对象(第 2.1 节)中的
client_id 匹配。¶
客户端使用 HTTP 重定向响应或通过用户代理 可用的其他方式,将资源所有者导向构造出的 URI。¶
例如,客户端指示最终用户的用户代理发出以下 HTTPS 请求:¶
为简洁起见,request 参数的值 已被缩写。¶
授权请求对象必须是以下 形式之一:¶
为了向后兼容等目的,客户端可以同时 在查询参数中重复发送请求对象中包含的参数。 但是,支持本规范的授权服务器 必须仅使用请求对象中包含的参数。¶
客户端将授权请求作为
请求对象,以 request
参数值的形式发送到授权端点。¶
以下是一个使用
request 参数的授权
请求示例
(值中的换行仅用于显示):¶
https://server.example.com/authorize?client_id=s6BhdRkqt3&
request=eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6
ICJzNkJoZFJrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBs
ZS5jb20iLAogICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAg
ICAiY2xpZW50X2lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6
ICJodHRwczovL2NsaWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAi
b3BlbmlkIiwKICAgICJzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2Ui
OiAibi0wUzZfV3pBMk1qIiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VU
ElVaPjqW_ToI1yrEJ67BgKb5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC
0iQJwXu5YVY-vnW0_PLJb1C2HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKz
uKzqSb1wAZALo5f89B_p6QA6j6JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3E
YLYaCb4ik4I1zGXE4fvim9FIMs8OCMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W
9typPf846lGwA8h9G9oNTIuX8Ft2jfpnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3
j1i7tLR_5Nz-g
¶
request_uri 授权请求参数使
OAuth 授权请求能够按引用而不是
按值传递。此参数的使用方式与
request 参数相同,区别在于请求对象值是
从指定 URI 所标识的资源中检索,
而不是按值传递。¶
整个请求 URI 不应该超过 512 个 ASCII 字符。 此限制有两个原因:¶
request_uri 所引用资源的内容
必须是请求对象,并且必须
可由授权服务器访问,
除非该 URI 是由授权服务器提供给客户端的。
在第一种情况下,request_uri 必须是
https URI,
如 第 2.7.2 节([RFC7230])中所规定。
在第二种情况下,它必须是 URN,
如 [RFC8141] 中所规定。¶
以下是一个
可由 request_uri 引用的
请求对象资源内容示例
(值中的换行仅用于显示):¶
eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6ICJzNkJoZF JrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLAog ICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAgICAiY2xpZW50X2 lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6ICJodHRwczovL2Ns aWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAib3BlbmlkIiwKICAgIC JzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2UiOiAibi0wUzZfV3pBMk1q IiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VUElVaPjqW_ToI1yrEJ67BgK b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g¶
客户端将请求对象资源存储在本地,
或远程存储在授权服务器可以访问的 URI 上。
这种设施可以由授权服务器
或受信任的第三方提供。例如,授权服务器可以
提供一个 URL,客户端向该 URL POST 请求对象并
获取请求 URI。
此 URI 即请求对象 URI,即 request_uri。¶
请求对象可能包含
仅应向授权服务器披露的值。
因此,如果 request_uri 可公开检索,则其在有效期内必须具有
适当的熵,
使该 URI 无法被猜测。
有关指导,请参阅
第 5.1.4.2.2 节([RFC6819])以及
“能力 URL 的良好实践” [CapURLs]。
建议在合理的超时时间
之后移除 request_uri,
除非采取了访问控制措施。¶
以下是一个 请求对象 URI 值的示例 (值中的换行仅用于显示)。 在此示例中,一个受信任的第三方服务托管请求对象。¶
https://tfp.example.org/request.jwt/
GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
¶
客户端将授权请求发送到 授权端点。¶
以下是一个
使用 request_uri 参数的授权请求示例
(值中的换行仅用于显示):¶
https://server.example.com/authorize?
client_id=s6BhdRkqt3
&request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt
%2FGkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
¶
如果请求对象已加密, 授权服务器必须按照 JSON Web 加密 [RFC7516] 规范解密 JWT。¶
结果是一个已签名的请求对象。¶
如果解密失败,授权服务器必须
在对授权请求的响应中向客户端
返回 invalid_request_object 错误。¶
授权服务器响应按照 第 4 节([RFC6749])(OAuth 2.0)中的方式创建并发送给客户端。¶
此外,本文档还使用以下附加错误值:¶
request_uri
返回错误或包含无效数据。¶
request 参数。¶
request_uri 参数。¶
支持请求对象 URI 方法的客户端实现 必须支持 TLS,并遵循 “安全使用 传输层安全性 (TLS) 和 数据报传输层安全性 (DTLS) 的建议” [RFC7525]。¶
为防止信息泄露和篡改, 必须使用采用 可提供机密性和完整性保护的密码套件的 TLS 来应用机密性保护。¶
HTTP 客户端还必须使用 DNS-ID [RFC6125] 验证 TLS 服务器证书,以避免中间人攻击。 此处适用 [RFC6125] 中定义的规则和指南,并有以下 注意事项:¶
由于请求对象是 JWT,因此核心 JWT 声明不能 在请求对象中用于 JWT 所规定用途之外的任何用途。 因此,它们已被注册为 OAuth 授权请求参数,以避免未来的 OAuth 扩展 使用这些参数表达不同含义。¶
本规范向由 [RFC6749] 建立的“OAuth 参数”注册表 [IANA.OAuth.Parameters] 添加以下值。¶
本规范向由 [RFC8414] 建立的“OAuth 授权服务器元数据”注册表 [IANA.OAuth.Parameters] 添加以下值。¶
本规范向由 [RFC7591] 建立的“OAuth 动态 客户端注册元数据”注册表 [IANA.OAuth.Parameters] 添加以下值。¶
本节按照
[RFC6838] 中所述的方式,在“媒体
类型”注册表 [IANA.MediaTypes] 中
注册 application/oauth-authz-req+jwt
媒体类型 [RFC2046]。它可用于
表明内容是一个包含请求
对象声明的 JWT。¶
.)字符分隔。¶
除了 OAuth 2.0 中讨论的安全 注意事项 [RFC6819]之外, 还需要考虑 [RFC7515]、[RFC7516]、 [RFC7518] 和 [RFC8725] 中的安全 注意事项。此外,还有一些学术论文,例如 [BASIN],它们对 OAuth 等协议的安全 属性提供了有用的见解。¶
考虑到上述内容,本文档建议将 以下安全注意事项纳入考虑。¶
通过
request 参数发送授权请求对象时,它必须
使用 JWS [RFC7515] 进行签名,
或者分别使用 JWS [RFC7515] 和
JWE [RFC7516] 先签名再加密,
并采用当时被认为适当的算法。¶
授权请求的来源必须始终 进行验证。有以下几种方法:¶
尽管本规范并不要求这样做, 但 [BASIN] 等研究指出, 以防篡改的方式明确说明 预期的交互端点以及消息在序列中的 位置是一种良好实践, 从而使发起者的意图明确无歧义。本规范 建议对 [RFC6749]、[RFC6750] 和 [RFC8414] 中定义的以下端点采用这种 做法:¶
protected_resources)¶
authorization_endpoint)¶
redirect_uri)¶
token_endpoint)¶
此外,如果使用动态发现,那么这种做法也适用于 与发现相关的端点。¶
在 [RFC6749] 中, 重定向 URI 包含在授权请求中,而其他端点 则不包含。因此,授权 请求对象也同样如此。¶
引入 request_uri
会带来多种可能的攻击。
有关与 URI 相关的风险的更多信息,
请参阅
第 7 节(
[RFC3986])中的安全注意事项。¶
一组恶意客户端可以通过将
request_uri 指向一个
返回极大内容或响应极其缓慢的 URI,
对授权服务器发起 DoS 攻击。
在这种攻击下,服务器可能耗尽其资源
并开始发生故障。¶
类似地,恶意客户端可以指定一个
request_uri 值,
该值本身指向一个使用
request_uri 的授权请求 URI,
从而导致递归查找。¶
为防止此类攻击成功,服务器应该
a) 检查 request_uri
参数的值是否未指向意外位置,
b) 检查响应的媒体类型是否为
application/oauth-authz-req+jwt,
c) 为获取
request_uri 的内容实现超时机制,以及
d) 不对
request_uri 执行递归 GET。¶
request_uri 的值没有经过签名;
因此,它可能被浏览器中间人攻击者篡改。
由此会产生多种可能的攻击。例如,
a) 攻击者可以创建另一个由重写后的
URI 指向的文件,从而能够请求额外的 scope,或者
b) 攻击者可以通过将 request_uri
的值设置为受害者站点的 URI,
对该站点发起 DoS 攻击。¶
为防止此类攻击成功,服务器应该
a) 检查 request_uri
参数的值是否未指向意外位置,
b) 检查响应的媒体类型是否为
application/oauth-authz-req+jwt,以及
c) 为获取
request_uri 的内容实现超时机制。¶
除非客户端和服务器所使用的协议被限定为 使用 OAuth JWT 保护的授权请求 (JAR),否则攻击者可能 使用 RFC 6749 请求 绕过本规范提供的所有保护。¶
为防止这种攻击,本规范定义了新的
客户端元数据值和服务器元数据值,两者均名为
require_signed_request_object,其值均为
布尔值。¶
当其作为客户端元数据的值为 true 时,
服务器必须拒绝来自
不符合本规范的客户端的授权请求。当此服务器
元数据值为 true 时,如果请求对象
使用的 alg 值为 none,它也
必须拒绝该请求。如果省略,默认值为
false。¶
当其作为服务器元数据的值为 true 时,
服务器必须拒绝来自
任何不符合本规范的客户端的授权请求。如果请求对象
使用的 alg 值为 none,它也
必须拒绝该请求。如果省略,
默认值为 false。¶
请注意,即使不存在 require_signed_request_object 元数据
值,只要客户端和服务器共同支持某些签名算法,
客户端可以使用已签名的请求对象。
签名算法元数据的使用在
第 4 节中说明。¶
当前的安全 注意事项可参见“安全使用 传输层安全性 (TLS) 和数据报传输层安全性 (DTLS) 的建议” [RFC7525]。这 取代了 OAuth 2.0 [RFC6749] 中的 TLS 版本建议。¶
鉴于 OAuth 参数值会在两个不同的位置发送,
即作为普通 OAuth 参数和作为请求对象声明,
实现必须防范可能利用不匹配的
参数值获得非预期结果的攻击。
这就是两个客户端 ID 值必须匹配的原因,
也是只能使用请求对象中的参数值的原因,
同样也是 request 和
request_uri 均不能出现在请求对象中的原因。¶
如 第 2.8 节([RFC8725])中所述, 攻击者可能试图将在某一用途下签发的 JWT 用于其原本并不适用的上下文中。 针对此类攻击所述的缓解措施可以应用于请求对象。¶
攻击者可能试图重新利用请求对象的一种方式
是尝试将其用作客户端身份验证 JWT,
如 第 2.2 节([RFC7523])中所述。
防止这种情况的一种简单方法是绝不在请求对象中将客户端 ID
用作 sub 值。¶
防止跨 JWT 混淆的另一种方式是使用显式类型,
如 第 3.11 节([RFC8725])中所述。
可以通过包含值为
oauth-authz-req+jwt 的
typ 头部参数来显式指定请求对象的类型
(该值已在 第 9.4.1 节中注册)。
但请注意,要求现有授权服务器使用显式指定类型的请求对象
会破坏大多数现有部署,
因为现有客户端已经普遍使用未指定类型的请求对象,
尤其是在 OpenID Connect [OpenID.Core] 中。
不过,对于无需考虑与现有部署兼容性的
新 OAuth 部署配置文件而言,
要求显式指定类型会是一个好主意。¶
最后,防止跨 JWT 混淆的另一种方式是采用一种密钥 管理机制,使得用于签署请求对象的密钥 能够明确区分于用于其他用途的密钥。这样,如果 攻击者试图在其他上下文中重新利用请求对象,就会发生密钥 不匹配,从而阻止攻击。¶
当客户端被授予访问包含个人数据的受保护资源的权限时, 客户端和授权服务器都需要遵守 隐私原则。 “互联网协议的隐私注意事项” [RFC6973] 为改进协议设计和实现 提供了很好的指导。 应遵循其中列出的规定。¶
其中大多数规定适用于 “OAuth 2.0 授权框架” [RFC6749] 和“OAuth 2.0 授权框架:承载令牌用法” [RFC6750], 并非本规范所特有。 以下仅说明 本规范特有的规定。¶
当客户端被授予访问包含个人数据的受保护资源的权限时, 客户端应该将 个人数据的收集限制在适用法律允许的范围内, 并且仅限于指定目的严格必需的数据。¶
用户通常很难确定所请求的个人数据 是否严格必要。受信任的第三方服务可以通过 检查客户端请求,将其与客户端拟进行的 处理相比较,并对该请求进行认证来帮助用户。认证 完成后,客户端在发出授权请求时,可以 向受信任的第三方服务提交授权请求,以 获取请求对象 URI。此过程分为两个步骤:¶
request_uri。¶
request_uri。受信任的第三方服务
还会按照前一步骤验证请求对象是否与
客户端有资格请求的声明一致。¶
在授权请求中收到这样的请求对象 URI 后,
授权服务器首先验证
请求对象 URI 的 authority 部分对于受信任的第三方
服务是否合法。然后,授权服务器向
请求对象 URI 发出 HTTP GET 请求。连接建立后,授权服务器
必须验证 TLS 证书中表示的服务器身份
对于该请求对象 URI 是否合法。然后,
授权服务器可以获取请求对象,其中包含
表示客户端的 client_id。¶
同意界面必须指明客户端,并且 应该指明该请求已经过 受信任第三方服务的审查,以确认其遵守收集 限制原则。¶
本规范允许扩展参数。 这些参数可能包含潜在的敏感信息。 由于 URI 查询参数可能通过各种 方式泄露,尤其是通过 referrer 和浏览器历史记录, 如果授权请求包含潜在敏感 参数,则客户端应该使用 JWE [RFC7516] 加密请求对象。¶
在使用请求对象 URI 方法时,如果请求
对象包含个人可识别信息或敏感信息,
则 request_uri 应该仅使用一次
并具有较短的有效期,并且除非请求对象
本身使用 JWE
[RFC7516] 加密,否则它必须具有
对适用安全策略而言足够的熵。适当短的
有效期以及请求对象 URI 的熵取决于
根据受保护资源价值进行的
风险计算。关于有效期的一般指导是少于
一分钟,并且在撰写本规范时,请求对象 URI 应包含
128 位或更多位的
加密随机值。¶
即使受保护资源不包含 个人可识别信息, 如果使用持久的、每用户固定的 请求对象 URI,有时仍可通过请求对象 URI 识别用户。第三方可能通过 浏览器历史记录等观察到它,并开始利用它 关联用户的活动。 从某种意义上说,这也是一种数据披露, 应当避免。¶
因此,应避免使用每用户持久的请求对象 URI。 一次性请求对象 URI 是一种替代方案。¶
以下人员在 OAuth 工作组及其他 IETF 职务中 为本文档的编写做出了贡献。 (采用其做出贡献时的所属机构。)¶
Annabelle Backman (Amazon), Dirk Balfanz (Google), Sergey Beryozkin, Ben Campbell (以 AD 身份), Brian Campbell (Ping Identity), Roman Danyliw (以 AD 身份), Martin Duke (以 AD 身份), Vladimir Dzhuvinov (Connect2id), Lars Eggert (以 AD 身份), Joel Halpern (以 GENART 身份), Benjamin Kaduk (以 AD 身份), Stephen Kent (以 SECDIR 身份), Murray Kucherawy (以 AD 身份), Warren Kumari (以 OPSDIR 身份), Watson Ladd (以 SECDIR 身份), Torsten Lodderstedt (yes.com), Jim Manico, James H. Manger (Telstra), Kathleen Moriarty (以 AD 身份), Axel Nennker (Deutsche Telecom), John Panzer (Google), Francesca Palombini (以 AD 身份), David Recordon (Facebook), Marius Scurtescu (Google), Luke Shepard (Facebook), Filip Skokan (Auth0), Hannes Tschofenig (ARM), Éric Vyncke (以 AD 身份), 和 Robert Wilton (以 AD 身份)。¶
以下人员通过 OpenID Connect Core 1.0 [OpenID.Core] 为本文档的编写做出了贡献。¶
Brian Campbell (Ping Identity), George Fletcher (AOL), Ryo Itou (Mixi), Edmund Jay (Illumila), Breno de Medeiros (Google), Hideki Nara (TACT), 和 Justin Richer (MITRE)。¶