GAE/JでGoogleアカウントを使った認証を実装する

GAE/Jでは、Googleアカウントを使って簡単に認証処理を実装できるそうだ。ということで、試してみた。論より証拠。

GAEのマニュアルにサンプルコードが載っているが、これをコピペしてもつまらないので、以下のように改造する。

  • 日本語でメッセージをだす。
  • ログインしていなかったら、ログインページへリダイレクトする。(マニュアルにredirectもサポートしている、と書いてあるので)

本当に簡単にできてしまったので、以下にメモしておく。

サンプル

まず、以下のトップ画面をだす。


ここでリンクをクリックすると、(ログインしていないので)「Googleの普通のログイン画面」がでる。


ログインをすると以下の画面に遷移して、ログインしたメイルアドレスを表示する。ここで、ログアウトをクリックすると、上のGoogleのログイン画面に遷移する。


以下の作業は、GAE/JプラグインがインストールされたEclipse3.4(Ganymede)で行った。

プロジェクトの作成

新規にWeb Applicationプロジェクトを作成する。このとき、GWTGoogle Web Toolkit)は使わないので、チェックを外す。

サーブレットの作成

プロジェクトの作成と同時に、index.htmlとサーブレットができる。index.htmlはそのままにしておいて、サーブレットを次のように改造する。
HttpServletRequestに定義されているgetUserPrincipal()を利用してAuthenticateされたユーザー情報を取得している。こんな簡単なコードで書けてしまうのはすごい!!

package test;
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;

@SuppressWarnings("serial")
public class GaeLogin2Servlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        UserService userService = UserServiceFactory.getUserService();

        String thisURL = request.getRequestURI();
        response.setContentType("text/html; charset=utf-8");

        if (request.getUserPrincipal() != null) {
            response.getWriter().println("<p>こんにちは、" +
                                         request.getUserPrincipal().getName() +
                                         "さん <a href=\"" +
                                         userService.createLogoutURL(thisURL) +
                                         "\">ログアウト</a>.</p>");
        } else {
            response.sendRedirect(userService.createLoginURL(thisURL));
        }
    }
}

テスト

まずは、ローカルサーバーでテストする。この際には、Googleのログイン画面の代わりに、下のような認証画面(みたいなもの)が出てくる。この画面はGoogleアカウントをなにも関係ないので、どんなメイルアドレス(存在しないものも)を入れても、ログイン完了画面に遷移する。


これが確認できたらGAE/Jにデプロイする。