AX 允许 OpenID 依赖方和提供者交换不受限制的信息,只要 RP 和 OP 都支持 AX 扩展。
简单地说,RP 通过消息请求 OP 提供特定的信息,OP 在消息中发送回这些信息。这些消息编码在浏览器重定向到的 URL 中,但是 openid4java 使用对象让代码可以使用这些信息。
RP 使用 FetchRequest 类发出 AX 请求。得到消息对象的引用之后,添加它希望从 OP 返回的属性,见清单 5:
清单 5. 包含属性的 RP FetchRequest
AuthRequest ret = obtainSomehow();
// Create AX request to get favorite color
FetchRequest fetchRequest = FetchRequest.createFetchRequest();
fetchRequest.addAttribute("favoriteColor",
"http://makotogroup.com/schema/1.0/favoriteColor",
false);
ret.addExtension(fetchRequest);
当 OP 把信息发送回 RP 时,使用相同的构造,见清单 6:
清单 6. OP 发送回请求的属性
if (authRequest.hasExtension(AxMessage.OPENID_NS_AX)) {
MessageExtension extensionRequestObject =
authRequest.getExtension(AxMessage.OPENID_NS_AX);
FetchResponse fetchResponse = null;
Map<String, String> axData = new HashMap<String, String>();
if (extensionRequestObject instanceof FetchRequest) {
FetchRequest axRequest = (FetchRequest)extensionRequestObject;
ParameterList parameters = axRequest.getParameters();
fetchResponse = FetchResponse.createFetchResponse(
axRequest, axData);
if (parameters.hasParameter("type.favoriteColor")) {
axData.put("favoriteColor", registrationModel.getFavoriteColor());
fetchResponse.addAttribute("favoriteColor",
"http://makotogroup.com/schema/1.0/favoriteColor",
registrationModel.getFavoriteColor());
}
authResponse.addExtension(fetchResponse);
} else {
// ERROR
}
}
面向Java Web应用程序的OpenID,第2部分(7)
时间:2011-12-08 ibm J Steven Perry
定义的每个属性有一个简单的名称和相关联的 URI。在这里,属性的简单名称是 FavoriteColor,它的 URI 是 http://makotogroup.com/schema/1.0/favoriteColor。
另外,属性必须能够转换为字符串 (以这种方式发送数据字段的示例见示例应用程序)。在定义要在 RP 和 OP 之间交换的属性时,两端对于属性的定义必须一致;除此之外,没有任何限制!
现在,讨论下一个应用程序交互步骤。
OP 验证用户的身份
在上一步中,身份验证请求已经到达了 OP 的端点 URL。接下来,OP 分解请求以决定后续操作。OP 打开请求,获取它的模式,模式可能是关联或身份验证。
清单 7. OP 处理关联请求
//From (OpenIdLoginPage''s constructor):
public OpenIdLoginPage(PageParameters parameters) throws IOException {
super(parameters);
. . .
if ("associate".equals(mode)) {
OpenIdProviderService.processAssociationRequest(getResponse(), requestParameters);
}
. . .
}
//From (OpenIdProviderService):
public static void processAssociationRequest(Response response, ParameterList request)
throws IOException {
Message message = getServerManager().associationResponse(request);
sendPlainTextResponse(response, message);
}
priv
|