清单 4 中第一行粗体代码显示了对 ConsumerManager.authenticate() 的调用,它其实不执行身份验证调用。它仅接受成功完成与 OP 的发现交互之后返回的 DiscoveryInformation 对象(参见 清单 3),以及身份验证成功之后用户代理(浏览器)指向的 URL。
第二行粗体代码显示了如何通过对 SRegRequest.createFetchRequest() 的静态方法调用创建 SReg 请求。然后通过对 SRegRequest 对象上 addAttribute() 的调用, 您需要的属性作为简单注册扩展(Simple Registration Extension)的一部分从 OP 返回。最后,通过调用 addExtension() 将扩展添加到 AuthRequest 。
openid4java 使所有这些动作都很直观。此时,浏览器指向负责验证用户身份的 OpenID 提供者,用户将在此页面输入其密码。参见
OpenIdRegistrationPage.java 查看执行重定向的 Wicket UI 代码。 图 2 显示了处理身份验证请求的 myOpenID 服务器截图。
图 2. 处理身份验证请求的 myOpenID
此时,您需要确保有代码能处理运行于 URL 上的请求,该 URL 被指定为 “return-to” URL(参见 清单 4)。示例应用程序的 return-to URL 在 RegistrationService.getReturnToUrl() 中被硬编码。
OpenIdRegistrationSavePage 的构造函数破解 Web 请求以查明它是否从 OP 返回。如果该请求确实是从 OP 返回,它必须得到验证。 验证
清单 5 显示的代码用于查明一个请求是否来自 OP。如果是,将会有一个参数 is_return,该参数的值为 true。 如果情况是这样的,那么 openid4java 用于验证请求(实际上是来自 OP 的响应)并取出 清单 4 中请求的属性。
清单 5. 处理 return-to URL
public OpenIdRegistrationSavePage(PageParameters pageParameters) { RegistrationModel registrationModel = new RegistrationModel(); if (!pageParameters.isEmpty()) {
String isReturn = pageParameters.getString(\ if (isReturn.equals(\
MakotoOpenIdAwareSession session =
MakotoOpenIdAwareSession)getSession(); DiscoveryInformation discoveryInformation = session.getDiscoveryInformation(); registrationModel =
RegistrationService.processReturn(discoveryInformation, pageParameters,
RegistrationService.getReturnToUrl()); if (registrationModel == null) {
error(\ } } }
add(new OpenIdRegistrationInformationDisplayForm(\ registrationModel)); }
在这段代码中,Wicket 页面的构造函数首先确定请求来自于 OP,是对先前身份验证请求的响应。它使用一种定制的 Session 类(MakotoOpenIdAwareSession)抓取 DiscoveryInformation 对象,在成功完成与 OP 的发现交互之后,该对象被存储。请求由 RegistrationService.processReturn() 方法使用 DiscoveryInformation 对象、请求参数和 return-to URL 得到验证。如果请求验证成功,会返回一个完全填充的 RegistrationModel 对象。这可以充当
OpenIdRegistrationSavePage 的 Wicket 模型,应用程序可在此继续其预定作用。 转到应用程序
如果对身份验证的响应得到成功检验,用户就有权通过 OpenID 访问由 RP 保护的任何资源。在示例应用程序中,这是注册过程。如果身份验证成功,会跳出一个页面,用户可在此页面审查来自 OP 的信息,并按需更改和保存信息。示例应用程序不包含真正保存注册信息的代码,不过有 hook。图 3 显示了我运行示例应用程序验证我的 OpenID 时来自 OP 的信息。
Figure 3. 显示来自 OP 的个人资料信息的示例应用程序
结束语
OpenID 用于解决大量的在线身份验证问题,已经作为一种可靠的身份管理解决方案而被广为接受。OpenID 的获取很简单,目前注册的 OpenID 已经达到数百万个。与任何其他规范一样,OpenID 身份验证 很复杂,不过 openid4java 极
大地简化了它。在本文中,您已经看到了 OpenID 身份验证的运作方式。您也了解了使用 openid4java 将 OpenID 加入 Java Web 应用程序中有多么简单。 在本文第 2 部分,我们将着重介绍 OpenID 谜题的另外半部分:编写 OpenID 提供者。这一部分的讨论也是围绕示例代码展开的,使用专门为本文编写的示例 Java Web 应用程序。同时,为在 Java Web 应用程序中实现 OpenID 身份验证,请随意使用 RegistrationService.java 上的代码。 回页首 下载 描述 OpenID 示例
名字
openid4java-sample-app.zip
大小 下载方法 4.3 MB HTTP
关于下载方法的信息
参考资料 学习
? OpenID 是一套分散式身份验证系统,它几乎与任何软件架构兼容。“保持 Project Zero 应用程序的安全性,第 3 部分:用 OpenID 保护 Project Zero 应用程序”(Todd Kaplinger 和 Gang Chen,developerWorks,2008 年 2 月)向您展示了如何使用 OpenID 确保 WebSphere sMash 应用程序的安全。 要了解关于 OpenID 的更多信息,没有比 阅读 OpenID 身份验证规范 2.0 版 更好的方式了。 参阅 OpenID Simple Registration Extension 1.0 规范。 “Wicket:一种构建和测试动态 Web 页面的简化框架”(Kumarsun Nadar,developerWorks,2008年 11 月)包含 Wicket 概述及其教程,教授如何使用 Wicket 快速构建基于 Web 的应用程序。 了解关于 Wicket 的更多信息,它是 Apache Foundation 的一个项目。 重温 DiffieHellman 密钥交换。 ? ? ? ? ? ? 对 Java Web 应用程序的安全解决方案感兴趣?请查看 Java Security 论坛 找寻答案或自己发帖查询。 在 技术书店 浏览关于这些主题和其他技术主题的图书。 developerWorks Java 技术专区:在这里可以找到数百篇关于 Java 编程的各个方面的文章。 加入 My developerWorks 社区。 ? ? ? 获得产品和技术
? ? 下载 openid4java。 从 myOpenID 获取 OpenID。 关于作者
J Steven Perry 是一名软件开发人员、架构师和全能 Java 专家,他从 1991 年起就从事专业的软件开发。他的专业兴趣包括 JVM 的内部工作原理和 UML 建模,以及介于两者之间的所有内容。Steve 编写了从技术文档到 Java 代码等各种内容,并且对教学和培训也充满了热情。Steve 是 Java Management Extensions(O’Reilly)的作者,Java Enterprise Best Practices(O’Reilly)的合著者,并撰写了有关软件开发主题和 O'Reilly ShortCut: Log4J 的杂志文章。