Получить адрес электронной почты от OpenId, используя Jboss / Seam - PullRequest
2 голосов
/ 29 мая 2010

Я использую класс org.jboss.seam.security.openid.OpenId для входа пользователя в мое веб-приложение. В настоящее время я сохраняю validatedId (openid.getValidatedId ()) в базе данных и прошу пользователя указать свой адрес электронной почты, имя и фамилию после входа в систему. Я использую Google, Yahoo, AOL и MyOpenID поставщики openId.

Есть ли способ получить адрес электронной почты и / или имя / фамилию пользователя, не заставляя их вводить это вручную?

1 Ответ

4 голосов
/ 30 мая 2010

Я быстро взглянул на класс OpenId в 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);
//        }

В любом случае вы, вероятно, можете использовать этот код в качестве отправной точки.

Изменить:

Мне удалось написать небольшую демонстрацию, основанную на примере OpenID Seam . К сожалению, мне пришлось скопировать / вставить код из Seam OpenId компонента , поскольку существующие биты кода обмена атрибутами были неполными, и нет очевидного способа его расширения.

Я не знаю, допустимо ли копирование / вставка кода LGPL в вашем проекте. В любом случае компонент OpenID от Seam является лишь тонкой оболочкой для библиотеки openid4java и может быть легко переписан.

Google, Yahoo, AOL и MyOpenID

Я попытался получить адрес электронной почты и личные имена пользователей, которые входили в систему, у четырех упомянутых вами провайдеров. Вот результат моего маленького эксперимента.

Из Google я получаю:

  • адрес электронной почты Gmail
  • Имя
  • Фамилия

Из AOL:

  • Электронная почта (по умолчанию электронная почта AOL, но пользователь может ввести другую)

От Yahoo:

  • Адрес электронной почты Yahoo
  • Полное имя (все в одной строке)

Из myOpenID:

  • E-mail (если пользователь добавил его в свой профиль)
  • ФИО (если пользователь указал его в своем профиле)

Мне пришлось включить как namspace http://schema.openid.net/contact/email, так и http://axschema.org в запрос, чтобы получить ответ от всех поставщиков.

...