Autentica usuarios con Java para el entorno de App Engine Standard

En esta parte del instructivo de Bookshelf, se muestra cómo crear un flujo de acceso para los usuarios que tienen Cuentas de Google y cómo usar la información del perfil con el objetivo de ofrecer funciones personalizadas a los usuarios.

Esta página forma parte de un instructivo de varias páginas. Para comenzar desde el principio y revisar las instrucciones de configuración, ve a la app de Bookshelf en Java.

Ejecuta la app en tu máquina local

Para ejecutar la app de manera local:

  1. En el directorio getting-started-java/bookshelf-standard/4-auth, ingresa el siguiente comando para iniciar un servidor web local:

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    Reemplaza [YOUR-BUCKET] por el nombre del depósito.
  2. En tu navegador web, ve a http://localhost:8080.

Ahora podrás navegar por las páginas web de la app, acceder con la Cuenta de Google, agregar libros y ver los libros que agregaste mediante el vínculo Mis libros en la barra de navegación superior.

Implementa la app en el entorno de App Engine Standard

Para implementar en el entorno estándar de App Engine, haz lo siguiente:

  1. Para crear un índice del almacén de datos que se cargue en la aplicación Bookshelf, cree al menos un libro y, luego, haz clic en Mis libros. Ten en cuenta que compilar la aplicación con el comando clean borra ese índice local, así que haz esto en la compilación de la aplicación que vas a implementar.
  2. En el directorio getting-started-java/bookshelf-standard/4-auth, ingresa este comando para implementar la aplicación:
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Reemplaza [YOUR-PROJECT-ID] por el ID del proyecto, y [YOUR-VERSION] por la versión, como 1, 2 o algún otro valor string que desees usar.
  4. En el navegador web, ingresa la siguiente URL:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Reemplaza lo siguiente:

Una vez que actualices la app, puedes volver a implementar la versión actualizada mediante el mismo comando que usaste cuando la implementaste por primera vez. Para ello, especifica el mismo ID del proyecto y la misma versión. Esto sobrescribe la aplicación implementada en la actualidad. Si especificas una cadena de versión diferente en la línea de comando actualizada, la nueva implementación crea una nueva versión de la aplicación y la promueve para que sea la versión de servicio actual.

Borra las versiones de la app que no estén en uso para reducir costos.

Para borrar la versión de una aplicación, haz lo siguiente:

  1. En Cloud Console, ve a la página Versiones de App Engine.

    Ir a la página Versiones

  2. Selecciona la casilla de verificación de la versión no predeterminada de la app que deseas borrar.
  3. Haz clic en Borrar para borrar la versión de la app.

Para obtener toda la información acerca de la limpieza de los recursos facturables, consulta la sección Limpieza del paso final de este instructivo.

Estructura de la app

En el siguiente diagrama, se muestran los componentes de la app y la manera en que se conectan entre sí.

Estructura de muestra de Auth

Comprende el código

En esta sección, se explica el código de la app y su funcionamiento.

Cuando el usuario hace clic en Iniciar sesión, el LoginServlet hace lo siguiente:

  1. Determina si el usuario ya accedió a una Cuenta de Google. Si es así, guarda la información del correo electrónico y el ID del usuario en la sesión actual.

  2. Si el usuario no accedió a una Cuenta de Google, lo redirecciona a la página de acceso correspondiente. Ten en cuenta que el servicio de usuarios de App Engine controla gran parte de la complejidad del acceso de usuarios por ti.

@SuppressWarnings("serial")
public class LoginServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {

    UserService userService = UserServiceFactory.getUserService();
    if (userService.isUserLoggedIn()) {
      // Save the relevant profile info and store it in the session.
      User user = userService.getCurrentUser();
      req.getSession().setAttribute("userEmail", user.getEmail());
      req.getSession().setAttribute("userId", user.getUserId());

      String destination = (String) req.getSession().getAttribute("loginDestination");
      if (destination == null) {
        destination = "/books";
      }

      resp.sendRedirect(destination);
    } else {
      resp.sendRedirect(userService.createLoginURL("/login"));
    }
  }
}

LogoutServlet borra el session y crea uno nuevo:

@SuppressWarnings("serial")
public class LogoutServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    // you can also make an authenticated request to logout, but here we choose to
    // simply delete the session variables for simplicity
    HttpSession session =  req.getSession(false);
    if (session != null) {
      session.invalidate();
    }
    // rebuild session
    req.getSession();
  }
}