Я быстро взглянул на класс 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 в запрос, чтобы получить ответ от всех поставщиков.