OpenID 是一种去中心化的身份认证系统,建置简便,甚至不需要一个帐号管理中心伺服器。在OpenID 中的使用案例中,参与者分成三种,即:
- End-user - 最终使用者,即服务的一般用户,每一个用户都使用一个URL 来代表自己。
- Identity provider - 身份提供者。身份登录与验证的服务提供者。
- Relying party - 委托者,向Identity provider 请求验证身份的参与者。通常是其他的服务提供者。
除了 身份的辩证外,OpenID也规范了委托者可以透过 OpenID Simple Registration Extension 1.0向身份提供者查询使用者的基本资讯。Simple Registration Extension指定了部份栏位的用途,例如:
- openid.sreg.nickname: Any UTF-8 string that the End User wants to use as a nickname.
- openid.sreg.email: The email address of the End User as specified in section 3.4.1 of [RFC2822] (Resnick, P., “Internet Message Format,” .).
- openid.sreg.fullname: UTF-8 string free text representation of the End User's full name.
- openid.sreg.language: End User's preferred language as specified by ISO639.
更多的栏位用途请参考 OpenID Simple Registration Extension 1.0。
OpenID 的三方交涉概念
OpenID 协定规范了代表最终使用者的agent (例如Web浏览器)与身份提供者和委托者交涉的内容, agent 藉由Cookie 保存认证状态。凭此状态,agent 可以存取其他的服务资源,而无需使用者再次输入密码。
例如mydomain.com 是身份提供者(Identity provider)。rock 在mydomain.com 登录了他的身份,则rock 可以用http://mydomain.com/rock 这个URL 代表他。接着rock 想要使用Gmail 服务,就以http://mydomain.com/rock 签入Gmail ,此时Gmail 就是委托者(Relying party) 。Gmail 会从代表rock 的URL 中,找出这个身份的提供者是mydomain.com ,接着就依OpenID 规范的交涉协定验证rock 是否已经登入了。
如果rock 事先已经在mydomain.com 完成登入动作,那么Gmail 就会得到rock 已登入的回应,rock 就不需要再次输入帐号和密码。反之若rock 尚未在任何地方登入,那么Gmail 的页面就要导向到mydomain.com 的登入页面去,让rock 完成登入动作。将使用者导向到登入页面的动作,是OpenID 协定的交涉动作之一。
The OpenID Authentication Process
本图取自「 Google is Now an OpenID Provider 」。
OpenID 实作品
基本上,委托者是根据代表身份的URL 判断身份提供者是谁。例如URL 是http://mydomain.com/rock , 则身份提供者就是mydomain.com 。委托者可以直接根据ID 找到身份提供者要求验证。因此,在一般情形下,OpenID 系统不需要所谓的身份认证中心伺服器。甚至于,一个最终使用者可以自己当自己的身份提供者。
例如rock 架设了个人主机rock.idv.tw ,启动了Identity provider 的服务。那么rock 就可以用http://rock.idv.tw/ 代表他自己。当有人(任何人)以http://rock.idv.tw/ 这个URL 向任何一个支援OpenID 的网路伺服要求服务时,那些服务者就要向rock.idv.tw 验证身份。
Niemira的phpMyID用了1800行的PHP code实作了一个单一帐号的身份提供者软体。使用者仅须在自己的主机上安装此程式,就可以做自己的身份提供者。
在 Yahoo! OpenID Usability Research文章中,补充了许多关于使用者体验改善的事项,可以让软体系统支援OpenID功能时,对使用者更为友善。
OpenID 已经有相当多的实作品,包含Libraries/API 在内。这些Libraries 可以提供编程人员在软体中实现Identity provider 、Relying party 功能。
OpenID Foundation提供了一份Libraries清单:Libraries。
- dyuproject - java REST framework, openid 2.0 relying party, oauth consumer and service provider, JSON IOC.
- JOID - JOID lets you create both OpenID 2.0 relying parties and identity providers.
- WSO2 Identity Server - WSO2 Identity Server is an open source identity and entitlement management server having Information Cards, OpenID and XACML support.