App Engine スタンダード環境での Java によるユーザー認証

Java 用の Bookshelf チュートリアルのこのパートでは、Google アカウントを持つユーザーのログインフローを作成する方法と、プロフィール情報を使用してユーザーにパーソナライズされた機能を提供する方法を説明します。

このページは複数ページからなるチュートリアルの一部です。最初からセットアップ手順を確認するには、Java Bookshelf アプリに移動してください。

ローカルマシンでのアプリの実行

アプリをローカルで実行するには:

  1. getting-started-java/bookshelf-standard/4-auth ディレクトリで、次のコマンドを入力し、ローカル ウェブサーバーを起動します。

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    [YOUR_BUCKET] は、使用するバケット名に置き換えてください。
  2. ウェブブラウザで http://localhost:8080 にアクセスします。

これでアプリのウェブページを開き、Google アカウントでログインして書籍を追加できます。追加した書籍は、上部のナビゲーション バーにある [My Books] リンクから確認できます。

App Engine スタンダード環境へのアプリのデプロイ

アプリを App Engine スタンダード環境にデプロイするには:

  1. Bookshelf アプリにアップロードされる Datastore インデックスを作成するには、少なくとも 1 つの書籍を作成して、[My Books] をクリックします。clean コマンドを使用してアプリをビルドすると、そのローカル インデックスが削除されます。したがって、デプロイするアプリのビルドでは必ずこの作業を行ってください。
  2. getting-started-java/bookshelf-standard/4-auth ディレクトリで、次のコマンドを入力してアプリをデプロイします。
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    [YOUR-PROJECT-ID] は実際のプロジェクト ID に、[YOUR-VERSION] は実際のバージョン(12 などの文字列値)に置き換えます。
  4. ウェブブラウザに次のアドレスを入力します。

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

    以下を置き換えます。

アプリを更新した後は、アプリを最初にデプロイしたときと同じコマンドに、同じプロジェクト ID とバージョンを指定することで、更新されたバージョンを再デプロイできます。これにより、現在デプロイされているアプリが上書きされます。更新時のコマンドラインで別のバージョン文字列を指定すると、新しいデプロイによってアプリの新しいバージョンが作成され、それが現行の提供バージョンとして採用されます。

アプリの提供バージョン以外のバージョンを削除することで、コストを削減できます。

アプリのバージョンを削除するには:

  1. Cloud Console で、App Engine の [バージョン] ページに移動します。

    [バージョン] ページに移動

  2. デフォルト以外で削除するアプリのバージョンのチェックボックスを選択します。
  3. [削除] をクリックして、アプリのバージョンを削除します。

課金対象のリソースをクリーンアップする方法の詳細については、このチュートリアルの最後のステップにあるクリーンアップ セクションをご覧ください。

アプリの構造

次の図は、アプリの各コンポーネントと、それらがどのように接続されているかを示しています。

Auth サンプルの構造

コードの説明

このセクションでは、アプリのコードとその動作を順を追って説明します。

ユーザーが [Login] をクリックすると、LoginServlet は次のことを行います。

  1. ユーザーが現在 Google アカウントにログインしているかどうかを判断し、ログインしている場合は、ユーザーのメールと ID 情報を現在のセッションに保存します。

  2. ユーザーが Google アカウントにログインしていない場合は、ユーザーを Google アカウントのログインページにリダイレクトします。ユーザーのログインに関連する複雑な処理のほとんどは App Engine ユーザー サービスによって処理されます。

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