TOC |
|
OpenID 认证提供了证明最终用户拥有其身份标识 URL 的方法。而不通过密码、邮件地址或者任何他们不想要的。
OpenID 是完全分散式的,也就是说任何人都可以选择成为消费者或者身份识别提供方而不需要去登记或者被一个中央当局批准。 最终用户可以选择他们喜欢的身份提供方并且可以任意地在不同的提供方之间移动切换。
在协议中也没有对 JavaScript 和现代浏览器的要求,认证方案允许用 AJAX 样式的设定,来使得最终用户不需要离开消费者页面。
OpenID 认证规范不提供任何机制来交换数据, 消费者可以从各种公开场获得最终用户的信息,比如下面的这些: (FOAF, RSS, Atom, vCARD, 等)。 扩展则提供了一个交换数据的机制。
1.
符号
2.
术语
3.
概述
3.1.
将 HTML 文档转换成标识
3.1.1.
委派认证
3.2.
提交声称的身份标识
3.3.
消费者站点抓取身份标识
3.4.
智能模式对沉默模式
3.5.
消费者核实身份标识
4.
方式
4.1.
associate
4.1.1.
请求参数
4.1.2.
返回参数
4.1.3.
其他注意事项
4.2.
checkid_immediate
4.2.1.
请求参数
4.2.2.
返回参数
4.2.3.
特别注意
4.3.
checkid_setup
4.3.1.
请求参数
4.3.2.
返回参数
4.3.3.
特别注意
4.4.
check_authentication
4.4.1.
Request Parameters
4.4.2.
返回参数
4.4.3.
特别注意
5.
安全考虑
Appendix A.
默认值
Appendix A.1.
Diffie-Hellman P 值
Appendix B.
Error Responses
Appendix C.
键-值格式
Appendix D.
限制
Appendix E.
其它
6.
规范参考
§
Authors' Addresses
TOC |
本文中所使用的关键词“必须”、“不能”、“必需的”、“应”、“不得”、“应该”、 “不应该”、“建议”、“可能”和“可选”由 [RFC2119] (Bradner, B., “Key words for use in RFCs to Indicate Requirement Levels,” .) 解释。
TOC |
- 最终用户(End User):
- 想向消费者证明他们的身份的实际人类用户。
- 身份标识(Identifier):
- 身份标识只是一个 URL。OpenID 认证协议的整个流程就是证明一个最终用户拥有一个 URL。
- 声称的身份标识(Claimed Identifier):
- 最终用户声称自己拥有的 但尚未被消费者验证的身份标识。
- 已验证的身份标识(Verified Identifier):
- 最终用户已经向消费者 证明了自己拥有的身份标识。
- 消费者(Consumer):
- 想要证明最终用户拥有其声 称的身份标识的 Web 服务。
- 身份标识提供方(Identity Provider):
- 又称“IdP”或者“服务 器”。消费者为了证明最终用户拥有其声称的身份标识,所联系的 OpenID 认证服务器。
最终用户如何向身份标识提供方提供证据不在 OpenID 认证范畴。- 用户代理(User-Agent):
- 最终用户的 Web 浏览器。特殊插件 或 JavaScript 支持不是必需的。
TOC |
TOC |
为了让消费者知道身份标识的提供方,最终用户必须在他们的 URL 所指的 HTML 文 档的 HEAD 部分增加一些标记。HTML 文档和最终用户的身份标识提供方不一定需要是同 一台主机;身份标识 URL 和身份标识提供方可以是两个完全分开的服务。
要使用 http://example.com/ 作为最终用户的身份标识 http://openid.example.com 作为他们的身份标识提供方,将下面的标签加入到身份标识 URL 所指的 HTML 文档的 HEAD 部分。
<link rel="openid.server" href="http://openid.example.com/">
TOC |
如果最终用户的主机不能运行一个身份标识服务器,或者最终用户希望使用一个不 同的主机,他们就需要委派认证。例如,他们想使用自己的站点 http://www.example.com/ 作为身份标识,并不是说要求他们自己运行一个身份标识服务器。
如果他们有一个 LiveJournal 帐号(比如“exampleuser”),并知道 LiveJournal 提供了一个 OpenID 的身份标识服务器,也就是说他们了拥有身份标识 http://exampleuser.livejournal.com/,那么就可以把他们的认证委派给 LiveJournal 的身份标识服务器。
所以,他们使用 www.exampoe.com 作为他们的身份标识,但消费者实际上是 通过 http://www.livejournal.com/openid/server.bml 这个身份标识服务器验证的 http://exampleuser.livejournal.com/,只需要将下面的标签加入到他们的身份标识 的 URL 所指的 HTML 文档的 HEAD 部分。
<link rel="openid.server" href="http://www.livejournal.com/openid/server.bml">
<link rel="openid.delegate" href="http://exampleuser.livejournal.com/">
现在,当消费者看到那个标签,它就会和 http://www.livejournal.com/openid/server.bml 联系询问最终用户是否是 exampleuser.livejournal.com。
这个功能主要的好处是让最终用户在服务商发生变化时可以保证他们的身份标识不发生变化; 他们只需要修改一下委派对象即可。
TOC |
TOC |
继续这个例子,最终用户访问一个支持 OpenID 认证的消费者站点。消费者呈现一个表单让他们输入身份标识 URL。
例如:
---------------------------------- |[徽标]example.com | [登录按钮] ----------------------------------
TOC |
TOC |
现在消费者站点需要去抓取用户声称的身份标识所指的文档。然后消费者解析其 HEAD 部分, 找到 “openid.server” 和可选的“openid.delegate” 定义。
TOC |
TOC |
OpenID 认证同时支持“智能模式”和“沉默模式”来容纳不同的消费者。 一个智能的消费者用保存状态信息的方式以便在开始阶段完成少许的工作。 一个“沉默模式”的消费者则是完全的无状态的,但是需要一个额外的 HTTP 请求。
TOC |
TOC |
消费者现在可以构建 URL 给身份提供者checkid_immediate (checkid_immediate) (或 checkid_setup (checkid_setup))并发送用户代理给它。
由用户代理发回最终用户的 cookies 或者其他的一些登录凭证给身份标识提供者。 身份标识提供者完成它的工作后,添附它的回应到参数 openid.return_to 指定的 URL, 并引导用户代理返回到消费者。
TOC |
TOC |
TOC |
值: "associate"
值: 你喜欢的关联类型
默认: "HMAC-SHA1"
注: 任意;当前只有这一个值。
值: 空白或 “DH-SHA1”
默认: 空白。 (明文)
注: 建议采用 DH-SHA1 方式去加密共享密钥。
值: base64(btwoc(p))
注: 参见 Appendix A.1 (Diffie-Hellman P 值) 中的默认 p 值。
值: base64(btwoc(g))
默认: g = 2
注: 仅在使用 DH-SHA1 session_type 时。当指定了 openid.dh_modulus 时,必须指定。
值: base64(btwoc(g ^ x mod p))
注: 在使用 DH-SHA1 session_type 时必需指定该值。
TOC |
返回格式: 键值对
值: 返回值的关联类型。
注: 当前唯一的模式是 HMAC-SHA1,所有的消费者必须支持这个模式。 当缓存的时候,消费者必须把 assoc_handle 映射到它自己的密钥和 assoc_type.
值:为将来的交换提供的关联句柄。
注: 消费者不能在 expires_in 值对应的时间后重复利用关联句柄。
值: 关联据并在 base10 ASCII 可用的秒数。
值: 身份标识提供方选择的加密模式。可以是空白、 "DH-SHA1"、或者不设置该值。
值: base64(btwoc(g ^ y mod p))
描述: 如果使用了 DH-SHA1,身份标识提供方的 Diffie-Hellman 公钥 (Rescorla, E., “Diffie-Hellman Key Agreement Method,” .) [RFC2631]
值: base64(SHA1(btwoc(g ^ (xy) mod p)) XOR secret(assoc_handle))
描述: 如果使用了 DH-SHA1,加密过的共享密钥。
值: base64(secret(assoc_handle))
描述: 如果没有使用 DH-SHA1,明文格式的共享密钥。
TOC |
TOC |
TOC |
值: "checkid_immediate"
值: 宣称的身份标识
值: 来自 associate 请求的 assoc_handle。
注: 可选的;消费者必须使用 check_authentication 如果没有提供关联句柄或者身份标识提供方认为它不正确。
值: 提供方应该将用户代理返回到的 URL。
值:提供方要求最终用户信任的 URL。
默认: return_to URL
可选的; 最终用户实际上将看到的批准的 URL。
TOC |
返回格式: 查询字符串参数
TOC |
值: "id_res"
TOC |
值: 重定向用户代理到的 URL,这样最终用户可以填入断言所需的必要资料。
TOC |
值: 已被核实的身份标识
值: 用来查找签名用的 HMAC key 的不透明的关联句柄。
值: 在身份标识提供方修改它之前,请求中发送的 return_to URL 参数的逐字拷贝。
值: 逗号分割的签名字段列表。
注: 字段不要添加 "openid." 前缀。例如, "mode,identity,return_to"。
值: base64(HMAC(secret(assoc_handle), token_contents)
注: 内容是返回值中所有的签名的键和键值的键值对格式的字符串。 他们必须和 openid.signed 字段里面列出的有相同的顺序。 消费者必须在检查的签名前再创建一个字符。参见 Appendix D (限制)。
值: 可选的;如果身份标识提供方不接受或者无法识别请求中发送的关联句柄。
TOC |
TOC |
TOC |
值: "checkid_setup"
值: 宣称的用户身份标识
值: The assoc_handle from the associate request.
注: 可选的; Consumer MUST use check_authentication if an association handle isn't provided or the Identity Provider feels it is invalid.
值: URL where the Provider SHOULD return the User-Agent back to.
值: URL the Provider SHALL ask the End User to trust.
默认: return_to URL
可选的; the URL which the End User SHALL actually see to approve.
TOC |
返回格式: 查询字符串参数
TOC |
值: "id_res" 或 "cancel"
TOC |
值: 已被核实的身份标识
值: Opaque association handle being used to fine the HMAC key for the signature.
值: Verbatim copy of the return_to URL parameter sent in the request, before the Provider modified it.
值: Comma-seperated list of signed fields.
注: Fields without the "openid." prefix that the signature covers. For example, "mode,identity,return_to".
值: base64(HMAC(secret(assoc_handle), token_contents)
注: Where token_contents is a key-value format string of all the signed keys and values in this response. They MUST be in the same order as listed in the openid.signed field. Consumer SHALL recreate the token_contents string prior to checking the signature. See Appendix D (限制).
值: Optional; The association handle sent in the request if the Provider did not accept or recognize it.
TOC |
TOC |
TOC |
值: "check_authentication"
值: The association handle from checkid_setup or checkid_immediate response.
值: The signature from the checkid_setup or checkid_immediate request the Consumer wishes to verify.
值: The list of signed fields from the checkid_setup or checkid_immediate request the Consumer wishes to verify the signature of.
值: The Consumer MUST send all the openid.* response parameters from the openid.signed list which they'd previously gotten back from a checkid_setup or checkid_immediate request, with their values being exactly what were returned from the Provider.
值: Optional; association handle returned via invalidate_handle.
TOC |
返回格式:键值对
值: "id_res"
值: “true” 或者 “false”
描述: 布尔值;签名是否正确。
值: opaque association handle
描述: If present, the Consumer SHOULD uncache the returned association handle.
TOC |
TOC |
TOC |
TOC |
1551728981814736974712322577637155\ 3991572480196691540447970779531405\ 7629378541917580651227423698188993\ 7278161526466314385615958256881888\ 8995127215884267541995034125870655\ 6549803580104870537681476726513255\ 7470407658574792912915723345106432\ 4509471500722962109419434978392598\ 4760375594985848253359305585439638443
TOC |
这个章节适用于协议/运行时错误,而不是认证错误。认证错误被定义在本协议中了。
TOC |
Lines of:
TOC |
TOC |
TOC |
[RFC2119] | Bradner, B., “Key words for use in RFCs to Indicate Requirement Levels.” |
[RFC2396] | Berners-Lee, T., “Uniform Resource Identifiers (URI): Generic Syntax.” |
[RFC2631] | Rescorla, E., “Diffie-Hellman Key Agreement Method.” |
TOC |
David Recordon | |
Email: | drecordon@verisign.com |
Brad Fitzpatrick | |
Email: | brad@danga.com |