


@Singleton
public class OpenIdServlet extends HttpServlet {
	
	@Override
	public void init() throws ServletException {
		super.init();
		
		// One-time initialization of RelyingParty.
		RelyingParty
				.getInstance()
				.addListener(
						new SRegExtension()
							.addExchange("email")
							.addExchange("nickname")
							.addExchange("fullname")
							.addExchange("gender")
							.addExchange("country")
							.addExchange("language")
						)
				.addListener(
						new AxSchemaExtension()
							.addExchange("email")
							.addExchange("nickname")
							.addExchange("fullname")
							.addExchange("gender")
							.addExchange("country")
							.addExchange("language")
						)
				.addListener(new RelyingParty.Listener() {
					@Override
					public void onDiscovery(OpenIdUser user,
						HttpServletRequest request) {
					}

					@Override
					public void onPreAuthenticate(OpenIdUser user,
						HttpServletRequest request,
						UrlEncodedParameterMap params) {
						String returnTo = params.get(Constants.OPENID_TRUST_ROOT)
												+ request.getRequestURI();
						params.put(Constants.OPENID_RETURN_TO, returnTo);
						params.put(Constants.OPENID_REALM, returnTo);
						params.put("openid.ns.ui",
								"http://specs.openid.net/extensions/ui/1.0");
						//params.put("openid.identifier_as_server", "true");
						//params.put("openid.ui.mode", "popup");
						params.put("openid.sreg.required", "fullname,email");
						params.put("openid.sreg.optional", "gender,nickname");
					}

					@Override
					public void onAuthenticate(OpenIdUser user,
							HttpServletRequest request) {
					}

					@Override
					public void onAccess(OpenIdUser user,
							HttpServletRequest request) {
					}
				});
	}
	
	public void doGet(	HttpServletRequest request,
						HttpServletResponse response) throws IOException, ServletException {
		
		OpenIdUser openIdUser = null;
		
		if( !RelyingParty.isAuthResponse(request) ) {
			// populate an uninitialized user into the request scope
			
			openIdUser = OpenIdUser.populate(
					"https://www.google.com/accounts/o8/site-xrds?hd=" + AppInstance.DOMAIN,
					YadisDiscovery.IDENTIFIER_SELECT,
					"https://www.google.com/a/" + AppInstance.DOMAIN + "/o8/ud?be=o8");

			request.setAttribute(OpenIdUser.ATTR_NAME, openIdUser);
			// put referer URL into the session so it can be used for redirection
			request.getSession().setAttribute(ATTR_REFERER, request.getHeader("referer"));
		}
		
		RelyingParty relyingParty = RelyingParty.getInstance();
		
		try {
			
			openIdUser = relyingParty.discover(request);
			
			if (openIdUser != null && openIdUser.isAssociated() && RelyingParty.isAuthResponse(request)) {
				// verify authentication
				if (relyingParty.verifyAuth(openIdUser, request, response)) {
					// authenticated
					
					Map<String,String> axSchema = AxSchemaExtension.get(openIdUser);
				    String email = axSchema.get("email");
				    String country = axSchema.get("country");
				    String fullname = axSchema.get("nickname");
				    System.out.println(fullname);
					....
				}
			}
		}
	}
}
