Users API for Java の概要

Users API をアプリケーションで使用すると、次のことができます。

  • 現在のユーザーがログイン済みかどうかを検出します。
  • ユーザーをログインさせるために、適切なログイン ページにリダイレクトします。
  • Google アカウントを持っていないアプリケーション ユーザーに、新規作成するよう要求します。

ユーザーがアプリケーションにログイン済みのときは、アプリケーションがユーザーのメールアドレスにアクセスできます。現在のユーザーが管理者(「管理ユーザー」と呼ばれることもあります)かどうかを検出することもでき、アプリの管理者専用領域の実装が容易になります。

Java でのユーザー認証

以下の例では、アプリケーションにログインしたユーザーに対し、パーソナライズされたメッセージとログアウト用のリンクを表示します。ユーザーがログインしていない場合は、Google アカウントのログインページへのリンクを表示します。

ユーザーがログイン済みかどうかを調べてそのユーザーのメールアドレスを取得するには、標準のサーブレット API を使用します。具体的には、要求オブジェクトの getUserPrincipal() メソッドを使用します。User Service API を使用して、ログインやログアウトの URL を生成できます。

Java 8

package com.example.appengine.users;

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required.
@WebServlet(
    name = "UserAPI",
    description = "UserAPI: Login / Logout with UserService",
    urlPatterns = "/userapi"
)
public class UsersServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    UserService userService = UserServiceFactory.getUserService();

    String thisUrl = req.getRequestURI();

    resp.setContentType("text/html");
    if (req.getUserPrincipal() != null) {
      resp.getWriter()
          .println(
              "<p>Hello, "
                  + req.getUserPrincipal().getName()
                  + "!  You can <a href=\""
                  + userService.createLogoutURL(thisUrl)
                  + "\">sign out</a>.</p>");
    } else {
      resp.getWriter()
          .println(
              "<p>Please <a href=\"" + userService.createLoginURL(thisUrl) + "\">sign in</a>.</p>");
    }
  }
}

Java 7

package com.example.appengine.users;

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UsersServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException {
    UserService userService = UserServiceFactory.getUserService();

    String thisUrl = req.getRequestURI();

    resp.setContentType("text/html");
    if (req.getUserPrincipal() != null) {
      resp.getWriter().println("<p>Hello, "
          + req.getUserPrincipal().getName()
          + "!  You can <a href=\""
          + userService.createLogoutURL(thisUrl)
          + "\">sign out</a>.</p>");
    } else {
      resp.getWriter().println("<p>Please <a href=\""
          + userService.createLoginURL(thisUrl)
          + "\">sign in</a>.</p>");
    }
  }
}

User Service API は、現在のユーザーの情報を User オブジェクトとして返すことができます。User オブジェクトはプロパティ値としてデータストアに格納できますが、これは避けることを強くおすすめします。このようにすると、メールアドレスもユーザーの一意の ID とともに保存されるからです。ユーザーが自分のメールアドレスを変更すると、アプリでそのユーザーの古いアドレス(User に格納されている)と新しい User の値とを比較したときに一致しなくなります。代わりに、User のユーザー ID 値をユーザーの不変の一意の ID として使用します。

web.xml を使用した強制ログインと管理者アクセス

特定のページについて、ログインしていないユーザーによるアクセスを禁止したい場合は、そのページに対するセキュリティ制限をデプロイ記述子(web.xml ファイル)の中で設定します。ユーザーがアクセスする URL にセキュリティ制限が設定されている場合に、そのユーザーがまだログインしてないときは、App Engine が自動的にユーザーをログインページにリダイレクトし(Google アカウントまたは G Suite による認証の場合)、ログインまたは登録が完了したら元の URL にリダイレクトします。

セキュリティ制限を利用すると、アプリケーションの登録済み管理者だけにアクセスを許可することもできます。つまり、ユーザーは基本的な役割である「閲覧者」、「編集者」、または「オーナー」が付与されているか、事前定義された役割「App Engine アプリ管理者」が付与されていることが必要になります。この機能を使用すれば、サイト内に管理者専用のセクションを容易に実装できます。別の認証メカニズムを導入する必要はありません。

URL のセキュリティ制限の設定方法については、デプロイ記述子: セキュリティと認証web.xml をご覧ください。

認証のオプション

アプリでユーザーの認証を行うには、次のオプションのいずれかを使用します。

  • Google アカウント
  • G Suite ドメインのアカウント

認証のオプションを選択する

アプリを作成した後で、どの認証オプションを使用するかを選択できます。デフォルトでは、Google アカウントがアプリでの認証に使用されます。G Suite ドメインなどの別のオプションを選択するには、Google Cloud Platform Console でプロジェクトの [設定] ページに移動し、[編集] をクリックします。[Google 認証] プルダウン メニューで認証のタイプを選択して [保存] をクリックします。

ログインとログアウト

選択した認証オプションを使用してユーザーがアプリにログイン済みかどうかをアプリで検出することができます。ユーザーがログインしていない場合は、Google アカウントでのログインまたは新しい Google アカウント作成のページに移動させることができます。ログインページの URL をアプリで取得するには、Users API のメソッドを呼び出します。アプリでは、この URL をリンクとして表示することも、URL への HTTP リダイレクトを発行することもできるので、認証を必要とするページをユーザーが訪問したときにこの機能を利用できます。

Google アカウントまたは G Suite を認証に使用するアプリケーションの場合、ユーザーがログインするときに、そのアプリケーションの名前がログインページに表示されます。表示される名前は、アプリケーションの登録時に指定されたアプリケーション名です。このアプリケーション名を変更するには、Google Cloud Platform Console の [認証情報] ページの [ユーザーに表示するサービス名] 項目を使用します。

ログインまたは Google アカウントの作成が完了すると、ユーザーは再びアプリケーションにリダイレクトされます。アプリは、ログイン URL を生成するメソッドにリダイレクトの URL を渡します。

Users API には、アプリからログアウトするための URL を生成するメソッドがあります。このログアウト URL は、アプリに対するユーザーの認証を解除してから、元のアプリの URL にリダイレクトしますが、特に何かを表示することはありません。

ユーザーがアプリにログインした状態になるのは、アプリの画面の指示に従ってユーザーが自分のアカウントのメールアドレスとパスワードを入力した場合のみです。これは、ユーザーが自分の Google アカウントを使用して別のアプリケーションにログイン済みかどうかとは無関係です。

アカウント情報にアクセスする

ユーザーがアプリにログイン済みのときは、そのユーザーがアプリに対して要求を行うたびにアプリがアカウントのメールアドレスにアクセスすることができます。アプリからユーザー ID にアクセスすることもできます。これはそのユーザーを一意に識別するものであり、ユーザーが自分のアカウントのメールアドレスを変更したときでも変化しません。

アプリは現在のユーザーがアプリの管理者かどうかを特定することもできます。管理ユーザーとは、基本的な役割である「閲覧者」、「編集者」、または「オーナー」が付与されているか、事前定義された App Engine のアプリケーション管理者役割が付与されているユーザーを指します。この機能を利用すると、アプリの管理用の機能を開発できます。他のユーザーは認証不要であってもかまいません。Go、Java、PHP、Python の API を利用して、URL を「管理者専用」に簡単に設定できます。

ユーザーとデータストア

User Service API は、現在のユーザーの情報を User オブジェクトとして返すことができます。User オブジェクトはプロパティ値としてデータストアに格納できますが、これは避けることを強くおすすめします。このようにすると、メールアドレスもユーザーの一意の ID とともに保存されるからです。ユーザーが自分のメールアドレスを変更すると、アプリでそのユーザーの古いアドレス(User に格納されている)と新しい User の値とを比較したときに一致しなくなります。代わりに、User のユーザー ID 値をユーザーの不変の一意の ID として使用します。

Google アカウントと開発用サーバー

開発用サーバーでは、Google アカウントのシステムをシミュレートするためにダミーのログイン画面が使用されます。アプリケーションが Users API を呼び出してログイン画面の URL を取得するときに、API からは特別な開発用サーバー URL が返されます。この URL ではメールアドレスの入力が要求されますが、パスワードは要求されません。この画面では任意のメールアドレスを入力でき、アプリはユーザーがそのアドレスのアカウントでログインしたものとして動作します。

このダミーのログイン画面には、ダミー アカウントが管理者かどうかを指定するためのチェックボックスもあります。管理者とは、基本的な役割である「閲覧者」、「編集者」、または「オーナー」が付与されているか、事前定義された App Engine のアプリケーション管理者役割が付与されているアカウントです。このチェックボックスをオンにすると、アプリはユーザーが管理者アカウントでログインしたものとして動作します。

同様に、Users API からはダミーのログインを取り消すためのログアウト URL も返されます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Java の App Engine スタンダード環境