Nutzer mit Java für die App Engine-Standardumgebung authentifizieren

Dieser Teil des Bookshelf-Tutorials für Java zeigt, wie Sie einen Anmeldefluss für Nutzer mit Google-Konten erstellen und Profilinformationen verwenden, um Nutzern personalisierte Funktionen bereitzustellen.

Diese Seite ist Teil einer mehrseitigen Anleitung. Wenn Sie dieses Beispiel von Beginn an durcharbeiten möchten, rufen Sie die Java Bookshelf-Anwendung auf und lesen Sie die Anleitung zur Einrichtung.

App auf lokalem Computer ausführen

So führen Sie die App lokal aus:

  1. Geben Sie im Verzeichnis getting-started-java/bookshelf-standard/4-auth den folgenden Befehl ein, um einen lokalen Webserver zu starten:

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    Ersetzen Sie [YOUR-BUCKET] durch Ihren Bucket-Namen.
  2. Rufen Sie in Ihrem Webbrowser http://localhost:8080/ auf.

Sie können nun auf den Webseiten der App stöbern, sich mit Ihrem Google-Konto anmelden, Bücher hinzufügen und sich die Bücher ansehen, die Sie über den Link Meine Bücher in der oberen Navigationsleiste hinzugefügt haben.

App in der App Engine-Standardumgebung bereitstellen

So stellen Sie die App in der App Engine-Standardumgebung bereit:

  1. Um einen Datenspeicherindex zu erstellen, der in die Bookshelf-App hochgeladen wird, erstellen Sie mindestens ein Buch und klicken Sie dann auf Meine Bücher. Beachten Sie, dass beim Erstellen der App mit dem Befehl clean dieser lokale Index gelöscht wird. Führen Sie dies also beim Erstellen der App aus, die Sie bereitstellen möchten.
  2. Geben Sie im Verzeichnis getting-started-java/bookshelf-standard/4-auth diesen Befehl ein, um die App bereitzustellen:
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Ersetzen Sie [YOUR-PROJECT-ID] durch Ihre Projekt-ID und [YOUR-VERSION] durch Ihre Version (zum Beispiel 1 oder 2) oder einen anderen zu verwendenden Stringwert.
  4. Geben Sie im Webbrowser die folgende URL ein:

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

    Ersetzen Sie Folgendes:

Nachdem Sie Ihre App aktualisiert haben, können Sie die aktualisierte Version noch einmal bereitstellen. Geben Sie dazu denselben Befehl wie bei der ersten Bereitstellung der App ein und dieselbe Projekt-ID und Version an. Dadurch wird die aktuell bereitgestellte App überschrieben. Wenn Sie in der aktualisierten Befehlszeile einen anderen Versionsstring angeben, erstellt die neue Bereitstellung eine neue Version Ihrer App und befördert sie zur aktuell bereitgestellten Version.

Sie können die Kosten senken, indem Sie die nicht standardmäßigen Versionen der App löschen.

So löschen Sie eine Anwendungsversion:

  1. Rufen Sie in der Cloud Console die Seite Versionen für App Engine auf.

    Zur Seite "Versionen"

  2. Klicken Sie auf das Kästchen für die nicht standardmäßige App-Version, die Sie löschen möchten.
  3. Klicken Sie auf Löschen , um die App-Version zu löschen.

Ausführliche Informationen zum Bereinigen kostenpflichtiger Ressourcen finden Sie im letzten Schritt dieser Anleitung im Abschnitt Bereinigen.

App-Struktur

Das folgende Diagramm zeigt die Komponenten der App und wie sie miteinander verbunden sind.

Auth-Beispielstruktur

Code verstehen

In diesem Abschnitt werden der App-Code und dessen Funktionsweise erläutert.

Wenn der Nutzer auf Anmelden klickt, führt LoginServlet Folgendes aus:

  1. Legt fest, ob der Nutzer derzeit in einem Google-Konto angemeldet ist, und speichert in diesem Fall die E-Mail- und ID-Informationen des Nutzers in der aktuellen Sitzung.

  2. Falls der Nutzer nicht bei einem Google-Konto angemeldet ist, wird er zur Anmeldeseite für Google-Konten umgeleitet. Der App Engine-Nutzerdienst wickelt die meisten komplexen Vorgänge der Nutzeranmeldung für Sie ab.

@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 löscht die session und erstellt eine neue:

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