RFC 9101 OAuth JAR 2021年8月
Sakimura 等 标准轨道 [页]
流:
互联网工程任务组 (IETF)
RFC:
9101
类别:
标准轨道
发布:
ISSN:
2070-1721
作者:
N. Sakimura
NAT.Consulting
J. Bradley
Yubico
M. Jones
Microsoft

RFC 9101

OAuth 2.0 授权框架:JWT 保护的授权请求(JAR)

摘要

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 获取。

▲

目录

1. 引言

OAuth 2.0 [RFC6749] 中的授权请求 采用查询参数 序列化,并且通常通过诸如 Web 浏览器之类的用户代理发送。

例如,参数 response_type、client_id、state 和 redirect_uri 被编码在请求的 URI 中:

    GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

虽然这很容易实现,但 URI 中的编码 不允许使用应用层安全机制来 提供机密性和完整性保护。 虽然 TLS 用于在客户端与用户代理之间以及用户代理与 授权服务器之间提供通信安全, 但 TLS 会话终止于用户代理。 此外,TLS 会话可能会 在某些中间设备(例如负载均衡器)处提前终止。

因此,[RFC6749] 的授权请求存在 以下缺陷:

(a)
通过用户代理进行的通信 没有受到完整性保护,因此参数可能被篡改 (完整性保护失败);
(b)
通信的来源未经身份验证 (来源身份验证失败);
(c)
通过用户代理进行的通信可能受到监视 (封装/机密性失败)。

由于这些固有弱点,已经发现了多种针对该 协议的攻击,例如重定向 URI 重写。

使用应用层安全机制可以缓解这些问题。

使用应用层安全机制允许由 受信任的第三方准备请求,从而使客户端应用程序无法请求超出 先前约定范围的权限。

此外,按引用传递请求可以减少网络传输开销。

选择 JWT [RFC7519] 编码是因为:

(1)
它与 JSON 关系密切, 而 JSON 被用作 OAuth 的响应格式
(2)
由于其文本性质,对开发者较为友好
(3)
与 XML 相比相对紧凑
(4)
它已发展为提议标准,并且 具有相关的签名和加密方法 [RFC7515] [RFC7516]
(5)
与 XML 签名和加密相比,JWS 和 JWE 相对易于使用。

参数 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] 作为请求编码而不是查询 参数具有以下几个优点:

(a)
完整性保护。 可以对请求进行签名,以便检查请求的完整性。
(b)
来源身份验证。 可以对请求进行签名,以便对签名者进行身份验证。
(c)
机密性保护。 可以对请求进行加密,从而即使 TLS 连接 在某个位置终止(包括在用户代理处及用户代理之前), 也能够提供端到端机密性。
(d)
最小化收集。请求可以由受信任的 第三方签名,以证明授权请求符合 某项策略。例如,可以由 受信任的第三方预先检查请求,以确认所请求的所有个人数据 对于执行最终用户所要求的流程而言都是 严格必要的; 随后由该受信任的第三方对请求进行签名。 授权服务器随后检查签名,并向 最终用户显示符合性状态,使最终用户在授权时能够对 请求的合法性具有一定保证。在某些情况下, 在这种情况下甚至可能希望跳过授权对话框。

在一些情况下,按引用请求很有用,例如:

  1. 当希望减小所传输请求的大小时。 使用应用层安全机制会增大 请求的大小,尤其是在使用公钥密码学时。
  2. 当客户端不希望执行应用层 密码学操作时。授权服务器可以提供一个端点, 通过与客户端直接通信来 接收授权请求,从而可以对客户端进行身份验证,并且信道受到 TLS 保护。

OpenID Connect [OpenID.Core] 正在使用此功能。

1.1. 要求用语

本文档中的关键词“必须”、“不得”、 “必需”、“应”、“不应 ”、“应该”、“不应该”、 “建议”、“不建议”、 “可以”和“可选” 仅当它们如本文所示以全大写形式出现时, 才应按照 BCP 14 [RFC2119] [RFC8174] 中的说明进行解释。

2. 术语

就本规范而言,除 OAuth 2.0 框架 [RFC6749]、 JSON Web 签名 [RFC7515] 和 JSON Web 加密 [RFC7516] 中定义的内容之外,还适用以下术语和 定义。

2.1. 请求对象

请求对象是一个 JSON Web Token (JWT) [RFC7519],其 JWT 声明 集包含经过 JSON 编码的 OAuth 2.0 授权请求 参数。

2.2. 请求对象 URI

请求对象 URI 是一个绝对 URI,它引用构成 OAuth 2.0 授权请求的一组参数。该 URI 所引用 资源的内容是一个 请求 对象(第 2.1 节),除非该 URI 是由同一授权服务器提供给客户端的,在这种情况下, 其内容属于由 授权服务器自行决定的实现细节。要求内容为请求对象,是为了确保在 request_uri 的提供者与消费者是不同 实体的情况下实现互操作性,例如客户端提供一个 URI, 该 URI 引用存储在客户端后端服务上的请求对象, 并通过 HTTPS 使其可访问。在后一种情况下,即 授权服务器既是该 URI 的提供者又是消费者,例如 它提供一个端点,用请求对象换取一个 URI 时,则不存在这种互操作性问题。

3. 符号和缩略语

以下缩写在本规范中通用。

JSON:
JavaScript 对象表示法
JWT:
JSON Web Token
JWS:
JSON Web 签名
JWE:
JSON Web 加密
URI:
统一资源标识符
URL:
统一资源定位符

4. 请求对象

一个 请求对象(第 2.1 节)用于 为 OAuth 2.0 授权 请求提供授权请求参数。它必须包含用于处理 OAuth 2.0 [RFC6749] 授权请求的所有参数(包括扩展 参数),但本文档中定义的 request 和 request_uri 参数除外。 这些参数表示为该对象的 JWT 声明。 参数名称和字符串值必须作为 JSON 字符串包含。 由于请求对象会跨域处理,并且可能 位于封闭生态系统之外,根据 第 8.1 节([RFC8259]), 这些 JSON 字符串必须使用 UTF-8 [RFC3629] 编码。 数值必须作为 JSON 数字包含。 请求对象可以包含任何扩展参数。 此 JSON [RFC8259] 对象构成 JWT [RFC7519] 中定义的 JWT 声明集。 随后对 JWT 声明集进行签名,或者先签名再加密。

进行签名时,使用 JSON Web 签名 (JWS) [RFC7515]。 结果是一个经 JWS 签名的 JWT [RFC7519]。如果 进行了签名,授权请求对象应该包含 声明 iss(签发者)和 aud(受众)作为成员, 其语义与 JWT [RFC7519] 规范中的定义相同。aud 的值 应当是 RFC 8414 [RFC8414] 中定义的授权服务器 (AS) issuer 的值。

进行加密时,使用 JWE [RFC7516]。 当同时应用签名和加密时, JWT 必须先签名,然后再加密,如 第 11.2 节( [RFC7519])中所述。 结果是 [RFC7519] 中定义的嵌套 JWT。

客户端确定用于签名和加密 请求对象的算法。所选算法需要同时得到 客户端和授权服务器的支持。客户端可以 在其动态客户端注册元数据 [RFC7591] 中 告知授权服务器其支持的算法, 具体来说,是元数据值 request_object_signing_alg、 request_object_encryption_alg 和 request_object_encryption_enc。同样, 授权服务器可以在其授权服务器元数据 [RFC8414] 中告知客户端其 支持的算法,具体来说,是元数据值 request_object_signing_alg_values_supported、 request_object_encryption_alg_values_supported 和 request_object_encryption_enc_values_supported。

请求对象可以按值发送,如 第 5.1 节所述, 也可以按引用发送,如 第 5.2 节所述。 request 和 request_uri 参数 不得包含在请求对象中。

一个 请求对象(第 2.1 节)具有媒体 类型 [RFC2046] application/oauth-authz-req+jwt。请注意,一些现有 部署可能会改用 application/jwt 类型。

以下是请求对象在进行 base64url [RFC7515] 编码 和签名之前其中声明的一个示例。 请注意,其中包含扩展参数 nonce 和 max_age。

  {
   "iss": "s6BhdRkqt3",
   "aud": "https://server.example.com",
   "response_type": "code id_token",
   "client_id": "s6BhdRkqt3",
   "redirect_uri": "https://client.example.org/cb",
   "scope": "openid",
   "state": "af0ifjsldkj",
   "nonce": "n-0S6_WzA2Mj",
   "max_age": 86400
  }

使用 RS256 算法 [RFC7518] 对其签名 会得到以下请求对象值 (值中的换行仅用于显示):

  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

以下 RSA 公钥以 JSON Web Key (JWK) 格式表示,可用于验证 此示例以及后续请求对象示例中的请求对象签名(值中的 换行仅用于显示):

  {
   "kty":"RSA",
   "kid":"k2bdc",
   "n":"x5RbkAZkmpRxia65qRQ1wwSMSxQUnS7gcpVTV_cdHmfmG2ltd2yabEO9XadD8
        pJNZubINPpmgHh3J1aD9WRwS05ucmFq3CfFsluLt13_7oX5yDRSKX7poXmT_5
        ko8k4NJZPMAO8fPToDTH7kHYbONSE2FYa5GZ60CUsFhSonI-dcMDJ0Ary9lxI
        w5k2z4TAdARVWcS7sD07VhlMMshrwsPHBQgTatlkxyIHXbYdtak8fqvNAwr7O
        lVEvM_Ipf5OfmdB8Sd-wjzaBsyP4VhJKoi_qdgSzpC694XZeYPq45Sw-q51iF
        UlcOlTCI7z6jltUtnR6ySn6XDGFnzH5Fe5ypw",
   "e":"AQAB"
  }

5. 授权请求

客户端通过使用 application/x-www-form-urlencoded 格式将以下参数添加 到授权端点 URI 的查询 组件中,来构造授权请求 URI:

request
除非指定了 request_uri,否则必需。 保存 第 4 节([RFC6749])(OAuth 2.0)中所述 授权请求参数的 请求对象(第 2.1 节)。 如果授权请求中存在此参数, 则不得存在 request_uri。
request_uri
除非指定了 request,否则必需。 由 RFC 3986 [RFC3986] 定义的绝对 URI,它是引用 第 4 节([RFC6749])(OAuth 2.0)中所述授权请求 参数的 请求对象 URI(第 2.2 节)。 如果授权请求中存在此参数, 则不得存在 request。
client_id
必需。OAuth 2.0 [RFC6749] client_id。该值必须与 request 或 request_uri 请求对象(第 2.1 节)中的 client_id 匹配。

客户端使用 HTTP 重定向响应或通过用户代理 可用的其他方式,将资源所有者导向构造出的 URI。

例如,客户端指示最终用户的用户代理发出以下 HTTPS 请求:

GET /authz?client_id=s6BhdRkqt3&request=eyJhbG..AlMGzw HTTP/1.1
Host: server.example.com

为简洁起见,request 参数的值 已被缩写。

授权请求对象必须是以下 形式之一:

(a)
经 JWS 签名
(b)
经 JWS 签名并经 JWE 加密

为了向后兼容等目的,客户端可以同时 在查询参数中重复发送请求对象中包含的参数。 但是,支持本规范的授权服务器 必须仅使用请求对象中包含的参数。

5.1. 按值传递请求 对象

客户端将授权请求作为 请求对象,以 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

5.2. 按引用传递请求 对象

request_uri 授权请求参数使 OAuth 授权请求能够按引用而不是 按值传递。此参数的使用方式与 request 参数相同,区别在于请求对象值是 从指定 URI 所标识的资源中检索, 而不是按值传递。

整个请求 URI 不应该超过 512 个 ASCII 字符。 此限制有两个原因:

  1. 在撰写本文时,市场上的许多手机仍不接受 较大的载荷。限制通常为 512 或 1024 个 ASCII 字符。
  2. 在 2G 移动连接等慢速连接上,较大的 URL 会导致响应缓慢;因此,从用户体验角度来看, 不建议使用这样的 URL。

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

5.2.1. 引用请求对象的 URI

客户端将请求对象资源存储在本地, 或远程存储在授权服务器可以访问的 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

5.2.2. 使用 "request_uri" 请求参数的请求

客户端将授权请求发送到 授权端点。

以下是一个 使用 request_uri 参数的授权请求示例 (值中的换行仅用于显示):

  https://server.example.com/authorize?
    client_id=s6BhdRkqt3
    &request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt
    %2FGkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM

5.2.3. 授权 服务器获取请求对象

收到请求后,授权服务器 必须向 request_uri 发送 HTTP GET 请求,以检索所引用的请求对象, 除非请求对象的存储方式使服务器能够 通过其他机制安全地检索它,并对其进行解析以 重新创建授权请求参数。

以下是此获取 过程的一个示例。在此示例中,一个受信任的第三方服务托管 请求对象。

GET /request.jwt/GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM HTTP/1.1
Host: tfp.example.org

以下是获取 响应的一个示例:

  HTTP/1.1 200 OK
  Date: Thu, 20 Aug 2020 23:52:39 GMT
  Server: Apache/2.4.43 (tfp.example.org)
  Content-type: application/oauth-authz-req+jwt
  Content-Length: 797
  Last-Modified: Wed, 19 Aug 2020 23:52:32 GMT

  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

6. 验证基于 JWT 的请求

6.1. JWE 加密的请求 对象

如果请求对象已加密, 授权服务器必须按照 JSON Web 加密 [RFC7516] 规范解密 JWT。

结果是一个已签名的请求对象。

如果解密失败,授权服务器必须 在对授权请求的响应中向客户端 返回 invalid_request_object 错误。

6.2. JWS 签名的请求 对象

授权服务器必须验证 经 JWS 签名的 [RFC7515] 请求 对象的签名。如果存在 kid 头部参数,则所标识的密钥 必须是使用的密钥,并且必须是 与客户端关联的密钥。签名必须 使用与客户端关联的密钥以及 alg 头部参数中指定的算法进行验证。必须执行算法验证,如 [RFC8725] 的第 3.1 节和第 3.2 节中所规定。

如果密钥未与客户端关联,或者签名 验证失败,授权服务器必须 在对授权请求的响应中向客户端返回 invalid_request_object 错误。

6.3. 请求参数 组装和验证

授权服务器必须从 请求对象值中提取 授权请求参数集合。 即使查询参数中提供了 相同参数,授权服务器也必须仅使用 请求对象中的参数。 client_id 请求参数中的客户端 ID 值 与请求对象 client_id 声明中的值必须 完全相同。 然后,授权服务器按照 OAuth 2.0 [RFC6749] 中的规定验证请求。

如果客户端 ID 检查或请求验证失败,则 授权服务器必须在对授权请求的响应中向 客户端返回错误,如 第 5.2 节([RFC6749])(OAuth 2.0)中所规定。

7. 授权服务器响应

授权服务器响应按照 第 4 节([RFC6749])(OAuth 2.0)中的方式创建并发送给客户端。

此外,本文档还使用以下附加错误值:

invalid_request_uri
授权请求中的 request_uri 返回错误或包含无效数据。
invalid_request_object
request 参数包含 无效的请求对象。
request_not_supported
授权服务器不支持 使用 request 参数。
request_uri_not_supported
授权服务器不支持使用 request_uri 参数。

8. TLS 要求

支持请求对象 URI 方法的客户端实现 必须支持 TLS,并遵循 “安全使用 传输层安全性 (TLS) 和 数据报传输层安全性 (DTLS) 的建议” [RFC7525]。

为防止信息泄露和篡改, 必须使用采用 可提供机密性和完整性保护的密码套件的 TLS 来应用机密性保护。

HTTP 客户端还必须使用 DNS-ID [RFC6125] 验证 TLS 服务器证书,以避免中间人攻击。 此处适用 [RFC6125] 中定义的规则和指南,并有以下 注意事项:

9. IANA 注意事项

9.1. OAuth 参数 注册

由于请求对象是 JWT,因此核心 JWT 声明不能 在请求对象中用于 JWT 所规定用途之外的任何用途。 因此,它们已被注册为 OAuth 授权请求参数,以避免未来的 OAuth 扩展 使用这些参数表达不同含义。

本规范向由 [RFC6749] 建立的“OAuth 参数”注册表 [IANA.OAuth.Parameters] 添加以下值。

名称:
iss
参数使用位置:
授权请求
变更控制者:
IETF
规范文档:
本文档以及 第 4.1.1 节([RFC7519])。
名称:
sub
参数使用位置:
授权请求
变更控制者:
IETF
规范文档:
本文档以及 第 4.1.2 节([RFC7519])。
名称:
aud
参数使用位置:
授权请求
变更控制者:
IETF
规范文档:
本文档以及 第 4.1.3 节([RFC7519])。
名称:
exp
参数使用位置:
授权请求
变更控制者:
IETF
规范文档:
本文档以及 第 4.1.4 节([RFC7519])。
名称:
nbf
参数使用位置:
授权请求
变更控制者:
IETF
规范文档:
本文档以及 第 4.1.5 节([RFC7519])。
名称:
iat
参数使用位置:
授权请求
变更控制者:
IETF
规范文档:
本文档以及 第 4.1.6 节([RFC7519])。
名称:
jti
参数使用位置:
授权请求
变更控制者:
IETF
规范文档:
本文档以及 第 4.1.7 节([RFC7519])。

9.2. OAuth 授权 服务器元数据注册表

本规范向由 [RFC8414] 建立的“OAuth 授权服务器元数据”注册表 [IANA.OAuth.Parameters] 添加以下值。

元数据名称:
require_signed_request_object
元数据描述:
指示授权 请求是否需要作为请求对象受到保护,并通过 request 或 request_uri parameter 提供。
变更控制者:
IETF
规范文档:
本文档的第 10.5 节。

9.3. OAuth 动态客户端 注册元数据注册表

本规范向由 [RFC7591] 建立的“OAuth 动态 客户端注册元数据”注册表 [IANA.OAuth.Parameters] 添加以下值。

元数据名称:
require_signed_request_object
元数据描述:
指示授权 请求是否需要作为请求对象受到保护,并通过 request 或 request_uri parameter 提供。
变更控制者:
IETF
规范文档:
本文档的第 10.5 节。

9.4. 媒体类型 注册

9.4.1. 注册表内容

本节按照 [RFC6838] 中所述的方式,在“媒体 类型”注册表 [IANA.MediaTypes] 中 注册 application/oauth-authz-req+jwt 媒体类型 [RFC2046]。它可用于 表明内容是一个包含请求 对象声明的 JWT。

类型名称:
application
子类型名称:
oauth-authz-req+jwt
必需参数:
不适用
可选参数:
不适用
编码注意事项:
二进制; 请求对象是 JWT; JWT 值被编码为一系列 经 base64url 编码的值(其中一些可能是 空字符串),并由句点(.)字符分隔。
安全注意事项:
参见 RFC 9101 的第 10 节
互操作性注意事项:
不适用
已发布规范:
RFC 9101 的第 4 节
使用此媒体类型的应用程序:
使用请求对象 发出 OAuth 2.0 授权 请求的应用程序
片段标识符注意事项:
不适用
附加信息:


此类型已弃用的别名:
不适用
魔数:
不适用
文件扩展名:
不适用
Macintosh 文件类型代码:
不适用
用于获取更多 信息的联系人及电子邮件地址:

Nat Sakimura <nat@nat.consulting>
预期用途:
常用
使用限制:
无
作者:
Nat Sakimura <nat@nat.consulting>
变更控制者:
IETF
临时注册?
否

10. 安全注意事项

除了 OAuth 2.0 中讨论的安全 注意事项 [RFC6819]之外, 还需要考虑 [RFC7515]、[RFC7516]、 [RFC7518] 和 [RFC8725] 中的安全 注意事项。此外,还有一些学术论文,例如 [BASIN],它们对 OAuth 等协议的安全 属性提供了有用的见解。

考虑到上述内容,本文档建议将 以下安全注意事项纳入考虑。

10.1. 算法选择

通过 request 参数发送授权请求对象时,它必须 使用 JWS [RFC7515] 进行签名, 或者分别使用 JWS [RFC7515] 和 JWE [RFC7516] 先签名再加密, 并采用当时被认为适当的算法。

10.2. 请求来源 身份验证

授权请求的来源必须始终 进行验证。有以下几种方法:

(a)
验证请求对象的 JWS 签名。
(b)
如果 JWE 使用对称加密,则验证用于 JWE 加密的对称密钥是否 正确。但请注意, 如果使用公钥加密,则加密本身无法实现来源身份验证,因为任何一方都可以使用该公 钥进行加密。
(c)
验证请求对象 URI 的 TLS 服务器身份。 在这种情况下,授权服务器必须通过 带外方式获知客户端使用请求对象 URI,并且 TLS 证书仅涵盖该客户端。 通常,这并不是一种可靠的方法。
(d)
当授权服务器实现一种 以请求对象换取请求对象 URI 的 服务时,授权 服务器必须执行客户端身份验证以接受 请求对象,并将客户端标识符 绑定到其提供的请求对象 URI。 它必须按照 (a) 验证签名。 由于请求对象 URI 可以被重放,因此请求对象 URI 的有效期 必须很短,并且最好 只能使用一次。请求对象 URI 的熵 必须足够大。 适当短的有效期以及 请求对象 URI 的熵取决于 基于受保护资源价值所进行的 风险计算。关于有效期的一般指导 是应少于一分钟, 并且在撰写本规范时,请求对象 URI 应包含 128 位或更多位的加密 随机值。
(e)
当受信任的第三方服务以请求对象换取请求对象 URI 时,它必须按照 (a) 验证 签名。此外,授权服务器 必须受该第三方服务信任,并且 必须通过带外方式获知客户端也受其信任。

10.3. 显式端点

尽管本规范并不要求这样做, 但 [BASIN] 等研究指出, 以防篡改的方式明确说明 预期的交互端点以及消息在序列中的 位置是一种良好实践, 从而使发起者的意图明确无歧义。本规范 建议对 [RFC6749]、[RFC6750] 和 [RFC8414] 中定义的以下端点采用这种 做法:

(a)
受保护资源(protected_resources)
(b)
授权端点(authorization_endpoint)
(c)
重定向 URI(redirect_uri)
(d)
令牌端点(token_endpoint)

此外,如果使用动态发现,那么这种做法也适用于 与发现相关的端点。

在 [RFC6749] 中, 重定向 URI 包含在授权请求中,而其他端点 则不包含。因此,授权 请求对象也同样如此。

10.4. 与 request_uri 相关的风险

引入 request_uri 会带来多种可能的攻击。 有关与 URI 相关的风险的更多信息, 请参阅 第 7 节( [RFC3986])中的安全注意事项。

10.4.1. 针对 授权服务器的 DDoS 攻击

一组恶意客户端可以通过将 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。

10.4.2. 请求 URI 重写

request_uri 的值没有经过签名; 因此,它可能被浏览器中间人攻击者篡改。 由此会产生多种可能的攻击。例如, a) 攻击者可以创建另一个由重写后的 URI 指向的文件,从而能够请求额外的 scope,或者 b) 攻击者可以通过将 request_uri 的值设置为受害者站点的 URI, 对该站点发起 DoS 攻击。

为防止此类攻击成功,服务器应该 a) 检查 request_uri 参数的值是否未指向意外位置, b) 检查响应的媒体类型是否为 application/oauth-authz-req+jwt,以及 c) 为获取 request_uri 的内容实现超时机制。

10.5. 降级攻击

除非客户端和服务器所使用的协议被限定为 使用 OAuth JWT 保护的授权请求 (JAR),否则攻击者可能 使用 RFC 6749 请求 绕过本规范提供的所有保护。

为防止这种攻击,本规范定义了新的 客户端元数据值和服务器元数据值,两者均名为 require_signed_request_object,其值均为 布尔值。

当其作为客户端元数据的值为 true 时, 服务器必须拒绝来自 不符合本规范的客户端的授权请求。当此服务器 元数据值为 true 时,如果请求对象 使用的 alg 值为 none,它也 必须拒绝该请求。如果省略,默认值为 false。

当其作为服务器元数据的值为 true 时, 服务器必须拒绝来自 任何不符合本规范的客户端的授权请求。如果请求对象 使用的 alg 值为 none,它也 必须拒绝该请求。如果省略, 默认值为 false。

请注意,即使不存在 require_signed_request_object 元数据 值,只要客户端和服务器共同支持某些签名算法, 客户端可以使用已签名的请求对象。 签名算法元数据的使用在 第 4 节中说明。

10.6. TLS 安全 注意事项

当前的安全 注意事项可参见“安全使用 传输层安全性 (TLS) 和数据报传输层安全性 (DTLS) 的建议” [RFC7525]。这 取代了 OAuth 2.0 [RFC6749] 中的 TLS 版本建议。

10.7. 参数不匹配

鉴于 OAuth 参数值会在两个不同的位置发送, 即作为普通 OAuth 参数和作为请求对象声明, 实现必须防范可能利用不匹配的 参数值获得非预期结果的攻击。 这就是两个客户端 ID 值必须匹配的原因, 也是只能使用请求对象中的参数值的原因, 同样也是 request 和 request_uri 均不能出现在请求对象中的原因。

10.8. 跨 JWT 混淆

如 第 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 混淆的另一种方式是采用一种密钥 管理机制,使得用于签署请求对象的密钥 能够明确区分于用于其他用途的密钥。这样,如果 攻击者试图在其他上下文中重新利用请求对象,就会发生密钥 不匹配,从而阻止攻击。

11. 隐私注意事项

当客户端被授予访问包含个人数据的受保护资源的权限时, 客户端和授权服务器都需要遵守 隐私原则。 “互联网协议的隐私注意事项” [RFC6973] 为改进协议设计和实现 提供了很好的指导。 应遵循其中列出的规定。

其中大多数规定适用于 “OAuth 2.0 授权框架” [RFC6749] 和“OAuth 2.0 授权框架:承载令牌用法” [RFC6750], 并非本规范所特有。 以下仅说明 本规范特有的规定。

11.1. 收集限制

当客户端被授予访问包含个人数据的受保护资源的权限时, 客户端应该将 个人数据的收集限制在适用法律允许的范围内, 并且仅限于指定目的严格必需的数据。

用户通常很难确定所请求的个人数据 是否严格必要。受信任的第三方服务可以通过 检查客户端请求,将其与客户端拟进行的 处理相比较,并对该请求进行认证来帮助用户。认证 完成后,客户端在发出授权请求时,可以 向受信任的第三方服务提交授权请求,以 获取请求对象 URI。此过程分为两个步骤:

(1)
(认证过程)受信任的第三方服务检查 客户端的业务流程,并确定其 需要哪些声明;这就是认证过程。客户端通过 认证后,会获得客户端凭据,用于进行身份验证, 以便将请求对象推送到受信任的第三方服务 来获取 request_uri。
(2)
(转换过程)客户端使用其获得的客户端凭据, 将请求对象推送到受信任的第三方服务, 以获取 request_uri。受信任的第三方服务 还会按照前一步骤验证请求对象是否与 客户端有资格请求的声明一致。

在授权请求中收到这样的请求对象 URI 后, 授权服务器首先验证 请求对象 URI 的 authority 部分对于受信任的第三方 服务是否合法。然后,授权服务器向 请求对象 URI 发出 HTTP GET 请求。连接建立后,授权服务器 必须验证 TLS 证书中表示的服务器身份 对于该请求对象 URI 是否合法。然后, 授权服务器可以获取请求对象,其中包含 表示客户端的 client_id。

同意界面必须指明客户端,并且 应该指明该请求已经过 受信任第三方服务的审查,以确认其遵守收集 限制原则。

11.2. 披露限制

11.2.1. 请求披露

本规范允许扩展参数。 这些参数可能包含潜在的敏感信息。 由于 URI 查询参数可能通过各种 方式泄露,尤其是通过 referrer 和浏览器历史记录, 如果授权请求包含潜在敏感 参数,则客户端应该使用 JWE [RFC7516] 加密请求对象。

在使用请求对象 URI 方法时,如果请求 对象包含个人可识别信息或敏感信息, 则 request_uri 应该仅使用一次 并具有较短的有效期,并且除非请求对象 本身使用 JWE [RFC7516] 加密,否则它必须具有 对适用安全策略而言足够的熵。适当短的 有效期以及请求对象 URI 的熵取决于 根据受保护资源价值进行的 风险计算。关于有效期的一般指导是少于 一分钟,并且在撰写本规范时,请求对象 URI 应包含 128 位或更多位的 加密随机值。

11.2.2. 使用 请求对象 URI 进行跟踪

即使受保护资源不包含 个人可识别信息, 如果使用持久的、每用户固定的 请求对象 URI,有时仍可通过请求对象 URI 识别用户。第三方可能通过 浏览器历史记录等观察到它,并开始利用它 关联用户的活动。 从某种意义上说,这也是一种数据披露, 应当避免。

因此,应避免使用每用户持久的请求对象 URI。 一次性请求对象 URI 是一种替代方案。

12. 参考文献

12.1. 规范性参考文献

[RFC2119]
Bradner, S.,“用于 RFC 中指示 要求级别的关键词”,BCP 14,RFC 2119,DOI 10.17487/RFC2119,,<https://www.rfc-editor.org/info/rfc2119>。
[RFC3629]
Yergeau, F.,“UTF-8,ISO 10646 的一种转换格式”,STD 63,RFC 3629,DOI 10.17487/RFC3629,,<https://www.rfc-editor.org/info/rfc3629>。
[RFC3986]
Berners-Lee, T.、Fielding, R. 和 L. Masinter,“统一资源标识符 (URI):通用语法”,STD 66,RFC 3986,DOI 10.17487/RFC3986,,<https://www.rfc-editor.org/info/rfc3986>。
[RFC6125]
Saint-Andre, P. 和 J. Hodges,“在传输层安全性 (TLS) 上下文中使用 X.509 (PKIX) 证书 在互联网公钥基础设施内表示和验证基于域的应用服务身份”,RFC 6125,DOI 10.17487/RFC6125,,<https://www.rfc-editor.org/info/rfc6125>。
[RFC6749]
Hardt, D., Ed.,“OAuth 2.0 授权 框架”,RFC 6749,DOI 10.17487/RFC6749,, <https://www.rfc-editor.org/info/rfc6749>。
[RFC6750]
Jones, M. 和 D. Hardt,“OAuth 2.0 授权框架:承载令牌用法”,RFC 6750,DOI 10.17487/RFC6750,,<https://www.rfc-editor.org/info/rfc6750>。
[RFC7230]
Fielding, R., Ed. 和 J. Reschke, Ed., “超文本传输协议 (HTTP/1.1):消息语法和路由”, RFC 7230,DOI 10.17487/RFC7230, ,<https://www.rfc-editor.org/info/rfc7230>。
[RFC7515]
Jones, M.、Bradley, J. 和 N. Sakimura,“JSON Web 签名 (JWS)”, RFC 7515,DOI 10.17487/RFC7515, ,<https://www.rfc-editor.org/info/rfc7515>。
[RFC7516]
Jones, M. 和 J. Hildebrand,“JSON Web 加密 (JWE)”,RFC 7516, DOI 10.17487/RFC7516,,<https://www.rfc-editor.org/info/rfc7516>。
[RFC7518]
Jones, M.,“JSON Web 算法 (JWA)”, RFC 7518,DOI 10.17487/RFC7518, ,<https://www.rfc-editor.org/info/rfc7518>。
[RFC7519]
Jones, M.、Bradley, J. 和 N. Sakimura,“JSON Web Token (JWT)”, RFC 7519,DOI 10.17487/RFC7519, ,<https://www.rfc-editor.org/info/rfc7519>。
[RFC7525]
Sheffer, Y.、Holz, R. 和 P. Saint-Andre,“安全使用 传输层安全性 (TLS) 和数据报传输层安全性 (DTLS) 的建议”,BCP 195,RFC 7525,DOI 10.17487/RFC7525,,<https://www.rfc-editor.org/info/rfc7525>。
[RFC8141]
Saint-Andre, P. 和 J. Klensin,“统一资源名称 (URN)”,RFC 8141,DOI 10.17487/RFC8141,,<https://www.rfc-editor.org/info/rfc8141>。
[RFC8174]
Leiba, B.,“RFC 2119 关键词中大写与 小写的歧义”,BCP 14,RFC 8174,DOI 10.17487/RFC8174,,<https://www.rfc-editor.org/info/rfc8174>。
[RFC8259]
Bray, T., Ed.,“JavaScript 对象表示法 (JSON) 数据交换格式”,STD 90,RFC 8259,DOI 10.17487/RFC8259,,<https://www.rfc-editor.org/info/rfc8259>。
[RFC8414]
Jones, M.、Sakimura, N. 和 J. Bradley,“OAuth 2.0 授权服务器 元数据”,RFC 8414,DOI 10.17487/RFC8414,,<https://www.rfc-editor.org/info/rfc8414>。

12.2. 资料性参考文献

[BASIN]
Basin, D.、Cremers, C. 和 S. Meier,“可证明地修复用于实体身份验证的 ISO/IEC 9798 标准”,《计算机 安全杂志——安全与信任原则》,第 21 卷,第 6 期,第 817-846 页,,<https://www.cs.ox.ac.uk/people/cas.cremers/downloads/papers/BCM2012-iso9798.pdf>。
[CapURLs]
Tennison, J., Ed.,“能力 URL 的 良好实践”,W3C 首次公开工作草案,,<https://www.w3.org/TR/capability-urls/>。
[IANA.JWT.Claims]
IANA,“JSON Web Token (JWT)”, <https://www.iana.org/assignments/jwt>。
[IANA.MediaTypes]
IANA,“媒体类型”,<https://www.iana.org/assignments/media-types>。
[IANA.OAuth.Parameters]
IANA,“OAuth 参数”,<https://www.iana.org/assignments/oauth-parameters>。
[OpenID.Core]
Sakimura, N.、Bradley, J.、Jones, M.B.、de Medeiros, B. 和 C. Mortimore,“OpenID Connect Core 1.0 (纳入勘误集 1)”,OpenID 基金会标准, ,<http://openid.net/specs/openid-connect-core-1_0.html>。
[RFC2046]
Freed, N. 和 N. Borenstein,“多用途互联网邮件扩展 (MIME) 第二部分:媒体类型”, RFC 2046,DOI 10.17487/RFC2046, ,<https://www.rfc-editor.org/info/rfc2046>。
[RFC6819]
Lodderstedt, T., Ed.、McGloin, M. 和 P. Hunt,“OAuth 2.0 威胁模型和安全 注意事项”,RFC 6819,DOI 10.17487/RFC6819,, <https://www.rfc-editor.org/info/rfc6819>。
[RFC6838]
Freed, N.、Klensin, J. 和 T. Hansen,“媒体类型规范和 注册程序”,BCP 13,RFC 6838,DOI 10.17487/RFC6838,,<https://www.rfc-editor.org/info/rfc6838>。
[RFC6973]
Cooper, A.、Tschofenig, H.、Aboba, B.、Peterson, J.、Morris, J.、Hansen, M. 和 R. Smith,“互联网 协议的隐私注意事项”,RFC 6973,DOI 10.17487/RFC6973,,<https://www.rfc-editor.org/info/rfc6973>。
[RFC7523]
Jones, M.、Campbell, B. 和 C. Mortimore,“用于 OAuth 2.0 客户端身份验证和授权许可的 JSON Web Token (JWT) 配置文件”,RFC 7523,DOI 10.17487/RFC7523,,<https://www.rfc-editor.org/info/rfc7523>。
[RFC7591]
Richer, J., Ed.、Jones, M.、Bradley, J.、Machulak, M. 和 P. Hunt,“OAuth 2.0 动态客户端注册 协议”,RFC 7591,DOI 10.17487/RFC7591,,<https://www.rfc-editor.org/info/rfc7591>。
[RFC8725]
Sheffer, Y.、Hardt, D. 和 M. Jones,“JSON Web Token 当前最佳 实践”,BCP 225,RFC 8725,DOI 10.17487/RFC8725,,<https://www.rfc-editor.org/info/rfc8725>。

致谢

以下人员在 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)。

作者地址

Nat Sakimura
NAT.Consulting
2-22-17 Naka
Kunitachi, Tokyo 186-0004
日本
电话: +81-42-580-7401
John Bradley
Yubico
Sucursal Talagante
Casilla 177
Talagante
RM
智利
电话: +1.202.630.5272
Michael B. Jones
Microsoft
One Microsoft Way
Redmond, Washington 98052
美利坚合众国