Uno de los servicios que ofrece Google en su plataforma app engine, es el acceso de usuarios a través de las sus cuentas de Google. Es la interfaz UserService la encargada de proporcionarnos esta información de usuario, así como de autenticarlo contra Google.

La interfaz UserServicenos permite:

  • Por un lado, verificar si el usuario se encuentra logueado.
  • Por otro lado, generar URLs de login y logout, para poder autenticarse contra Google y, una vez hecho ésto, ser redirigidos a donde indiquemos.

Además, también nos permite determinar si el usuario es o no administrador de la aplicación, pero ya veremos esa configuración en otro momento.

Vamos a ver un sencillo ejemplo de un filtro que valide que un usuario esté logueado contra la plataforma de Google para poder acceder a nuestra aplicación.

package appspot.ejemplo;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class UserFilter implements Filter{

	private FilterConfig filterConfig = null;

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletResponse resp = (HttpServletResponse)response;
		HttpServletRequest req = (HttpServletRequest)request;

		//Obtenemos el servicio de usuarios
		UserService userService = UserServiceFactory.getUserService();

		if(userService.getCurrentUser() == null){ //Si el usuario no está logado
			//Capturamos la URL en que nos encontramos
			String currentURL = req.getRequestURL().toString();
			//Generamos URL de login contra Google. Una vez logados, volveremos a la URL actual
			String loginURL = userService.createLoginURL(currentURL);
			//En lugar de ir a donde íbamos, redirigimos a la URL de login
			resp.sendRedirect(loginURL);
			return;
		}

		//En caso de estar logado, proseguir de manera normal
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}

}

Supongamos que queremos que nuestro usuario esté autenticado en todas aquellas páginas dentro de la url /user/loquesea, entonces, definiremos el filtro para el patrón /user/* en nuestro fichro web.xml:

<filter>
	<filter-name>UsersFilter</filter-name>
	<filter-class>appspot.podkaiser.UserFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>UsersFilter</filter-name>
	<url-pattern>*</url-pattern>
</filter-mapping>

Para los preocupados por la privacidad, deciros que la única información útil que nos proporciona Google del usuario es muy poca, y es la siguiente:

authdomain = gmail.com
email = xxxx@gmail.com
federatedIdentity = null
nickname = xxxx
userId = 1XXXXXXXXXXXXXXXXXXX4

Referencias:

Anuncios