Authentifier les utilisateurs avec Java pour l'environnement standard App Engine

Cette partie du tutoriel consacré à Bookshelf pour Java explique comment créer un flux de connexion pour les utilisateurs et comment utiliser les informations de profil pour leur fournir des fonctionnalités personnalisées.

Ce tutoriel comporte plusieurs pages. Pour le suivre depuis le début et consulter les instructions relatives à la configuration, accédez à la page Application Bookshelf pour Java.

Exécuter l'application sur votre machine locale

Pour exécuter l'application localement :

  1. Dans le répertoire getting-started-java/bookshelf-standard/4-auth, saisissez la commande suivante pour démarrer un serveur Web local :

    mvn -Plocal clean appengine:devserver -Dbookshelf.bucket=[YOUR-BUCKET]
    Remplacez [YOUR-BUCKET] par le nom de votre bucket.
  2. Dans votre navigateur Web, accédez à http://localhost:8080.

Vous pouvez maintenant consulter les pages Web de l'application, vous connecter à l'aide de votre compte Google, ajouter des livres et consulter ceux que vous avez ajoutés en suivant le lien Mes livres dans la barre de navigation supérieure.

Déployer l'application dans l'environnement standard App Engine

Pour un déploiement dans l'environnement standard App Engine :

  1. Pour créer un index Cloud Datastore chargé dans l'application Bookshelf, créez au moins un livre, puis cliquez sur Mes livres. Notez que la création de l'application à l'aide de la commande clean supprime cet index local. Effectuez donc cette opération lors de la création de l'application que vous allez déployer.
  2. Pour déployer l'exemple d'application, saisissez la commande suivante dans le répertoire getting-started-java/bookshelf-standard/4-auth :
    mvn appengine:update -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Remplacez [YOUR-PROJECT-ID] par votre ID de projet et [YOUR-VERSION] par votre version, par exemple 1 ou 2, ou par une autre valeur de chaîne que vous souhaitez utiliser.
  3. Dans votre navigateur Web, saisissez l'adresse suivante :
    https://[YOUR-PROJECT-ID].appspot.com
    Remplacez [YOUR-PROJECT-ID] par votre ID de projet.

Une fois que vous avez mis à jour votre application, vous pouvez redéployer la dernière version en saisissant la même commande que celle que vous avez utilisée pour déployer l'application pour la première fois, et en spécifiant le même ID de projet et la même version. Cela écrase l'application actuellement déployée. Si vous spécifiez une chaîne de version différente dans la ligne de commande mise à jour, le nouveau déploiement génère une nouvelle version de votre application, qui est alors définie comme version active.

Vous pouvez réduire les coûts en supprimant les versions inactives de votre application.

Pour supprimer une version d'application :

  1. Dans Cloud Console, accédez à la page Versions pour App Engine.

    Accéder à la page Versions

  2. Cochez la case correspondant à la version de l'application autre que celle par défaut que vous souhaitez supprimer.
  3. Cliquez sur Supprimer  pour supprimer la version de l'application.

Pour en savoir plus sur le nettoyage des ressources facturables, consultez la section Effectuer un nettoyage de la dernière étape de ce tutoriel.

Structure de l'application

Le schéma suivant montre les composants de l'application et décrit la façon dont ils sont interconnectés.

Auth sample structure

Comprendre le code

Cette section décrit le code de l'application et son fonctionnement.

Lorsque l'utilisateur clique sur Se connecter, LoginServlet effectue les opérations suivantes :

  1. Il détermine si l'utilisateur est actuellement connecté à un compte Google et, le cas échéant, enregistre l'e-mail et l'identifiant de l'utilisateur dans la session en cours.

  2. Si l'utilisateur n'est pas connecté à un compte Google, il est redirigé vers la page de connexion. Notez que le service Users d'App Engine gère pour vous l'essentiel de la complexité de la connexion utilisateur.

@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"));
    }
  }
}

La méthode LogoutServlet supprime l'élément session et génère une nouvelle session :

@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();
  }
}