All Downloads are FREE. Search and download functionalities are using the official Maven repository.

at.molindo.wicketutils.openid.OpenIdSession Maven / Gradle / Ivy

/**
 * Copyright 2010 Molindo GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package at.molindo.wicketutils.openid;

import java.util.List;

import org.apache.wicket.Application;
import org.apache.wicket.MetaDataKey;
import org.apache.wicket.Session;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.io.IClusterable;
import org.openid4java.association.AssociationException;
import org.openid4java.consumer.ConsumerException;
import org.openid4java.consumer.ConsumerManager;
import org.openid4java.consumer.InMemoryConsumerAssociationStore;
import org.openid4java.consumer.InMemoryNonceVerifier;
import org.openid4java.consumer.VerificationResult;
import org.openid4java.discovery.DiscoveryException;
import org.openid4java.discovery.DiscoveryInformation;
import org.openid4java.discovery.Identifier;
import org.openid4java.message.AuthRequest;
import org.openid4java.message.AuthSuccess;
import org.openid4java.message.MessageException;
import org.openid4java.message.MessageExtension;
import org.openid4java.message.ParameterList;
import org.openid4java.message.ax.AxMessage;
import org.openid4java.message.ax.FetchRequest;
import org.openid4java.message.ax.FetchResponse;
import org.openid4java.message.sreg.SRegMessage;
import org.openid4java.message.sreg.SRegRequest;
import org.openid4java.message.sreg.SRegResponse;

import at.molindo.wicketutils.utils.WicketUtils;

public class OpenIdSession implements IClusterable {

	private static final MetaDataKey CONSUMER_MANAGER_KEY = new MetaDataKey() {
		private static final long serialVersionUID = 1L;
	};

	private static final long serialVersionUID = 1L;

	private DiscoveryInformation discoveryInformation;

	public static OpenIdSession get() {
		return getWebSession().getOpenIdSession();
	}

	public static IOpenIdWebSession getWebSession() {
		return (IOpenIdWebSession) Session.get();
	}

	protected String getOpenIdReturnUrl() {
		return WicketUtils.toUrl(OpenIdReturnPage.class).toString();
	}

	public void processReturn(PageParameters params) {
		ParameterList response = new ParameterList(WicketUtils.toMap(params));
		try {
			VerificationResult verificationResult = getConsumerManager().verify(getOpenIdReturnUrl(), response,
					discoveryInformation);
			Identifier verifiedIdentifier = verificationResult.getVerifiedId();
			if (verifiedIdentifier != null) {
				AuthSuccess authSuccess = (AuthSuccess) verificationResult.getAuthResponse();

				OpenIdDetails details = new OpenIdDetails();
				details.setOpenId(verifiedIdentifier.getIdentifier());

				// try to get additional details
				if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)) {
					MessageExtension ext = authSuccess.getExtension(AxMessage.OPENID_NS_AX);

					if (ext instanceof FetchResponse) {
						FetchResponse fetchResp = (FetchResponse) ext;

						details.setMail(fetchResp.getAttributeValue("email"));

						String fullname = fetchResp.getAttributeValue("fullname");
						if (fullname == null) {
							String firstname = fetchResp.getAttributeValue("firstname");
							String lastname = fetchResp.getAttributeValue("lastname");

							if (firstname == null) {
								fullname = lastname == null ? null : lastname;
							} else if (lastname != null) {
								fullname = firstname + " " + lastname;
							} else {
								fullname = firstname;
							}
						}
						details.setName(fullname);
					}
				} else if (authSuccess.hasExtension(SRegMessage.OPENID_NS_SREG)) {
					MessageExtension extension = authSuccess.getExtension(SRegMessage.OPENID_NS_SREG);
					if (extension instanceof SRegResponse) {
						SRegResponse sRegResponse = (SRegResponse) extension;
						details.setMail(sRegResponse.getAttributeValue("email"));
						details.setName(sRegResponse.getAttributeValue("fullname"));
					}
				}
				getWebSession().onOpenIdAuthSuccess(details);
			} else {
				getWebSession().onOpenIdAuthError();
			}

		} catch (MessageException e) {
			throw new WicketRuntimeException("verification failed", e);
		} catch (DiscoveryException e) {
			throw new WicketRuntimeException("discovery failed", e);
		} catch (AssociationException e) {
			throw new WicketRuntimeException("association failed", e);
		}
	}

	private ConsumerManager getConsumerManager() {
		Application app = Session.get().getApplication();
		ConsumerManager consumerManager = app.getMetaData(CONSUMER_MANAGER_KEY);
		if (consumerManager == null) {
			// double checked locking
			synchronized (CONSUMER_MANAGER_KEY) {
				consumerManager = app.getMetaData(CONSUMER_MANAGER_KEY);
				if (consumerManager == null) {
					consumerManager = new ConsumerManager();
					consumerManager.setAssociations(new InMemoryConsumerAssociationStore());
					consumerManager.setNonceVerifier(new InMemoryNonceVerifier(10000));
					app.setMetaData(CONSUMER_MANAGER_KEY, consumerManager);
				}
			}
		}
		return consumerManager;
	}

	public void redirect(String openId) {
		discoveryInformation = performDiscovery(openId);

		AuthRequest authRequest = createOpenIdAuthRequest();

		WicketUtils.performTemporaryRedirect(authRequest.getDestinationUrl(true));
	}

	private AuthRequest createOpenIdAuthRequest() {
		try {
			ConsumerManager consumerManager = OpenIdSession.get().getConsumerManager();

			AuthRequest auth = consumerManager.authenticate(discoveryInformation, OpenIdSession.get()
					.getOpenIdReturnUrl());

			if (discoveryInformation.getTypes().contains(AxMessage.OPENID_NS_AX)) {
				FetchRequest fetch = FetchRequest.createFetchRequest();
				fetch.addAttribute("email", "http://axschema.org/contact/email", true);
				fetch.addAttribute("fullname", "http://axschema.org/namePerson", false);
				fetch.addAttribute("firstname", "http://axschema.org/namePerson/first", false);
				fetch.addAttribute("lastname", "http://axschema.org/namePerson/last", false);
				auth.addExtension(fetch);
			} else if (discoveryInformation.getTypes().contains(SRegMessage.OPENID_NS_SREG)) {
				SRegRequest sregReq = SRegRequest.createFetchRequest();

				sregReq.addAttribute("fullname", true);
				sregReq.addAttribute("email", true);

				auth.addExtension(sregReq);
			}

			return auth;
		} catch (MessageException e) {
			throw new WicketRuntimeException("failed to create OpenID AuthRequest", e);
		} catch (ConsumerException e) {
			throw new WicketRuntimeException("failed to create OpenID AuthRequest", e);
		}
	}

	private DiscoveryInformation performDiscovery(String openId) {
		try {
			ConsumerManager consumerManager = getConsumerManager();
			List discoveries = consumerManager.discover(openId);
			return consumerManager.associate(discoveries);
		} catch (DiscoveryException e) {
			throw new WicketRuntimeException("discovery failed", e);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy