使用Jboss / Seam从OpenId获取电子邮件地址

时间:2010-05-29 19:35:47

标签: java openid seam

我正在使用org.jboss.seam.security.openid.OpenId类将用户登录到我的seam webapp。目前我正在将validatedId(openid.getValidatedId())保存到数据库中,并要求用户在登录后提供自己的电子邮件地址和姓名。我正在使用Google,Yahoo,AOL和MyOpenID for openId Providers。

有没有办法检索用户的电子邮件地址和/或姓/名,而无需手动输入?

1 个答案:

答案 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获得:

  • Gmail电子邮件地址
  • 名字
  • 姓氏

来自美国在线:

  • 电子邮件(默认为AOL电子邮件,但用户可以输入其他电子邮件)

来自雅虎:

  • 雅虎电子邮件地址
  • 全名(全部在一个字符串中)

来自myOpenID:

  • 电子邮件(如果用户已在其个人资料中提交了一个)
  • 全名(如果用户已在其个人资料中提交了一个)

我必须在请求中包含 http://schema.openid.net/contact/email http://axschema.org namspace才能获得所有提供商的回复。