我正在使用org.jboss.seam.security.openid.OpenId类将用户登录到我的seam webapp。目前我正在将validatedId(openid.getValidatedId())保存到数据库中,并要求用户在登录后提供自己的电子邮件地址和姓名。我正在使用Google,Yahoo,AOL和MyOpenID for openId Providers。
有没有办法检索用户的电子邮件地址和/或姓/名,而无需手动输入?
答案 0 :(得分:4)
我快速浏览了OpenId class in Seam 2.2.0.GA,它已经包含了一些用于检索用户电子邮件地址的暂定代码。
当用户登录时,代码已经要求提供电子邮件地址。
protected String authRequest(String userSuppliedString, String returnToUrl)
throws IOException
{
...
// Attribute Exchange example: fetching the 'email' attribute
FetchRequest fetch = FetchRequest.createFetchRequest();
fetch.addAttribute("email",
"http://schema.openid.net/contact/email", // type URI
true); // required
还有用于从响应中提取该电子邮件的注释代码。
public String verifyResponse(HttpServletRequest httpReq)
{
...
// AuthSuccess authSuccess =
// (AuthSuccess) verification.getAuthResponse();
// if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)) {
// FetchResponse fetchResp = (FetchResponse) authSuccess
// .getExtension(AxMessage.OPENID_NS_AX);
//
// List emails = fetchResp.getAttributeValues("email");
// String email = (String) emails.get(0);
// }
在任何情况下,您都可以使用该代码作为起点。
修改强>
我设法写了small demo based on the Seam OpenID sample。遗憾的是,我不得不复制/粘贴Seam OpenId component中的代码,因为属性交换代码的现有位是不完整的,并且没有明显的方法来扩展它。
我不知道你的项目是否可以接受复制/粘贴LGPL代码。无论如何,Seam的OpenID组件只是openid4java库的一个薄包装器,可以轻松地重写。
Google,Yahoo,AOL和MyOpenID
我尝试从您提到的四个提供商处获取用户登录的用户的电子邮件地址和个人姓名。以下是我的小实验的结果。
从Google获得:
来自美国在线:
来自雅虎:
来自myOpenID:
我必须在请求中包含 http://schema.openid.net/contact/email 和 http://axschema.org namspace才能获得所有提供商的回复。