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

Java 用の Bookshelf のチュートリアルのこのパートでは、App Engine Users サービスを使用して、Google アカウントを持っているユーザーのログインフローを作成する方法と、プロフィール情報に基づいてユーザー固有の機能を提供する方法を説明します。

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

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

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

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

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

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

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

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

  1. Bookshelf アプリケーションのローカルでの演習を完了します。特に、少なくとも 1 つの書籍を作成して [My Books] をクリックしておきます。これにより、Bookshelf とともにアップロードされる、必要な Cloud Datastore のインデックスが作成されます。clean を使用してアプリケーションをビルドすると、そのローカル インデックスが削除されます。したがって、デプロイするアプリケーションのビルドでは必ずこの作業を行ってください。
  2. 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
    [YOUR-PROJECT-ID] を実際のプロジェクト ID に、[YOUR-VERSION] を実際のバージョン(12 などの文字列値)に置き換えます。
  3. ウェブブラウザに次のアドレスを入力します。
    https://[YOUR-PROJECT-ID].appspot.com
    [YOUR-PROJECT-ID] を実際のプロジェクト ID に置き換えます。

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

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

アプリのバージョンを削除する手順は次のとおりです。

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

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

  2. 削除したい、デフォルト以外のアプリのバージョンの横にあるチェックボックスをクリックします。
  3. ページ上部にある [削除] ボタンをクリックし、アプリのバージョンを削除します。

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

アプリケーションの構造

次の図は、アプリケーションを構成するコンポーネントと、それらの接続関係を示しています。

Auth サンプルの構造

コードを理解する

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

ユーザーが [Login] をクリックすると、LoginServlet が呼び出されます。この処理内容は次のとおりです。

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

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

@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();
  }
}
このページは役立ちましたか?評価をお願いいたします。