Я быстро взглянул на 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);
// }
В любом случае вы, вероятно, можете использовать этот код в качестве отправной точки.
Edit:
мне удалось написать small demo based on the Seam OpenID sample. К сожалению, мне пришлось копировать/вставлять код из Seam OpenId component, так как существующие биты кода обмена атрибутами были неполными, и нет очевидного способа его расширения.
Я не знаю, допустимо ли копирование/вставка кода LGPL в ваш проект. В любом случае компонент OpenID от Seam является лишь тонкой оболочкой библиотеки openid4java и может быть легко переписан.
Google, Yahoo, AOL и MyOpenID
Я попытался извлечь адрес электронной почты и личного имени пользователей с регистрацией, с четырех провайдеров вы упомянули. Вот результат моего небольшого эксперимента.
С помощью Google я получаю:
- Gmail адрес электронной почты
- Имя
- Фамилия
от AOL:
- Email (по умолчанию AOL по электронной почте, но пользователь может ввести другой)
От Yahoo:
- Yahoo адрес электронной почты
- Полное имя (все в одной строке)
От myOpenID:
- Email (если пользователь подал один в его профиле)
- Полное имя (Если пользователь подал один в своем профиле)
я должен был включать как http://schema.openid.net/contact/email и http://axschema.org в пространствах имёны запрос, чтобы получить ответ от всех поставщиков.
Я проверил трафик с помощью HTTPFox, и я вижу, что «openid.ext1.value.email» - это параметр, который предоставляет Google, но другие поставщики openid (aol, myopenid, yahoo) этого не делают. В любом случае, я хотел бы получить это от SEAM. Я пробовал это: HttpServletRequest httpRequest = ServletContexts.instance(). GetRequest(); String email = httpRequest.getParameter ("openid.ext1.value.email"); в моем классе действия, но ничего не существует. – Andy
Я предложил проверить HTTP-запросы, чтобы убедиться, что несколько бит на месте были жизнеспособной отправной точкой. Мне удалось собрать какой-то рабочий код. Надеюсь, это поможет вам в дальнейшем. Я обновил свой пост соответственно. –