お気に入り | 日本語 | ログイン

Google アカウント Java API 概要

App Engine アプリケーションは、Google アカウントを持つユーザーを認証することができます。アプリケーションは、現在のユーザーが Google アカウントでログインしているかどうかを検知することができます。また、ログインまたは新しいアカウントの作成を促すため、Google アカウントのログインページにリダイレクトすることもできます。ユーザーがアプリケーションにログイン中は、アプリケーションはユーザーのメール アドレス にアクセスできます。アプリケーションは現在のユーザーが管理者かどうかも検知できるため、アプリケーションの管理者のみに許可するエリアの実装も容易です。

Google アカウントの統合は、App Engine のオプション機能です。アプリケーションと Google アカウントを統合したくない場合は、いつでも独自のユーザー認証システムを構築できます。Google アカウントは、完成された一連の機能と何百万ものアクティブ ユーザーを抱える、強固で、簡単な認証メカニズムを提供しています。

Java での Google アカウントの使用

リクエスト オブジェクトの getUserPrincipal() メソッドと共に標準サーブレット API を使用し、ユーザーが Google アカウントにログインしているかどうかテストし、メール アドレスを取得できます。ユーザー サービス API を使用し、ログインおよびログアウトの URL を生成できます。

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

public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        UserService userService = UserServiceFactory.getUserService();

        String thisURL = request.getRequestURI();
        if (request.getUserPrincipal() != null) {
            response.getWriter().println("<p>Hello, " +
                                         request.getUserPrincipal().getName() +
                                         "!  You can <a href=\"" +
                                         userService.createLogoutURL(thisURL) +
                                         "\">sign out</a>.</p>");
        } else {
            response.getWriter().println("<p>Please <a href=\"" +
                                         userService.createLoginURL(thisURL) +
                                         "\">sign in</a>.</p>");
        }
    }
}

ユーザー サービス API は現在のユーザーの情報を User オブジェクトとして返します。User オブジェクトは、プロパティ値としてデータストアに格納できます。

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

ログインしていないユーザーはアクセスできないページがある場合、配備記述子(web.xml ファイル)においてそれらのページへのセキュリティ制限を設定できます。ログインしていないユーザーがセキュリティ制限のある URL にアクセスした場合、App Engine はユーザーを Google アカウントのログイン ページへと自動的にリダイレクトし、ログインまたは登録が完了した後に再度その URL へとリダイレクトします。

セキュリティ制限では、ユーザーをアプリケーションの登録管理者に制限することもできます。この機能を使用し、サイト内に管理者のみのセクションを容易に実装できます。別の認証メカニズムを導入する必要はありません。

URL へのセキュリティ制限の設定方法は、配備記述子: セキュリティと認証をご覧ください。

ログインとログアウト

アプリケーションは、ユーザーが Google アカウントを使用してアプリケーションにログインしたかどうかを検知できます。ユーザーがログインしていない場合、アプリケーションはユーザーを Google アカウントのログインまたはアカウントの新規作成へとナビゲーションします。アプリケーションは Users API のメソッドをコールし、Google アカウントのログイン画面の URL を取得します。ユーザーが認証を必要とするページへアクセスした場合、アプリケーションはその URL をリンクとして表示するか、または URL への HTTP リダイレクトを発行することができます。

Google アカウントのログイン画面には、デベロッパーが登録時に選択したアプリケーション名が表示されるので、ユーザーはログイン先のアプリケーションを確認できます。アプリケーション名は管理コンソールの「アプリケーション設定」セクションで変更できます。

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

Users API には、アプリケーションからログアウトする URL を生成するメソッドも含まれています。ログアウト URL はユーザーのアプリケーションへの認証を解除し、アプリケーションの URL へリダイレクトしますがブラウザには何も表示しません。

ユーザーは、アプリケーションからのログイン プロンプトが表示され、アカウントのメール アドレスおよびパスワードを入力するまでアプリケーションにはログインされません。ユーザーが Google アカウントを使用し他のアプリケーションにログインしている場合も同様です。

アカウント情報へのアクセス

ユーザーがアプリケーションにログインしている間は、ユーザーがアプリケーションにリクエストを送信するごとに、アプリケーションはアカウントのメール アドレスにアクセスできます。

現在のユーザーがアプリケーションの管理者(デベロッパー)であるかどうかも識別できます。他のユーザーの認証に Google アカウントを使用しない場合も、この機能を使用し、アプリケーションの管理機能を構築できます。Java API および Python API を使用し、特定の URL を簡単に「管理者専用」として設定できます。

ユーザーとデータストア

App Engine データストアは、Google アカウント API が特別な値タイプとして返す User オブジェクトの格納をサポートしています。この記事の執筆時には、User 値はユーザーの安定した識別子として動作していません。アプリケーションがユーザー値を保存している間に、ユーザーがメール アドレスを変更した場合、User 値は有効なユーザーを参照できなくなります。実際には、ユーザーはめったに Google アカウントのメール アドレスを変更することはありませんが、この点を考慮して設計すべきです。今後のサービス更新により、データストアの User 値が自動的に更新されるようになる予定です。それまでは、User 値の正確さに依存しない方がよいでしょう。

Java API では現在、メール アドレス以外の一意なユーザー ID を取得できません。

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

開発サーバーは、ダミーのログイン画面を使用し、Google アカウント システムをシミュレートしています。アプリケーションがユーザー API をコールしてログイン画面の URL を取得する際、API は開発サーバー用の特別な URL を返します。この URL はメール アドレスのプロンプトは表示しますが、パスワードのプロンプトは表示しません。このプロンプトに任意のメール アドレスを入力します。アプリケーションは、そのアドレスのアカウントにログインしたかのように動作します。

ダミーのログイン画面には、このアカウントが管理者かどうかを指定するチェックボックスも表示されます。このボックスをチェックすると、アプリケーションは管理者アカウントを使用してログインしたかのように動作します。

同様に、Users API はダミーのログインをキャンセルするためのログアウト URL を返します。