Googleアカウントを使ってGAE/Jアプリのログイン処理の実装

以下の説明を元にやってみた。
http://code.google.com/intl/ja/appengine/docs/java/users/overview.html
Googleのアカウントを使ってアプリケーションにログインさせるのはものすごい簡単に実装出来る。(ちなみにSlim3を使ってます。)
ログイン制御するには2通りあって

  • コードで制御する方法
  • web.xmlのURLのパターンで指定する方法

が、ある。まずは、コードで制御する方法から。Slim3のコントローラクラスに以下のように書きます。

UserService userService = UserServiceFactory.getUserService();
String thisURL = request.getRequestURI();
if (request.getUserPrincipal() != null) {
    // ログインしている場合の処理
    requestScope("loginInfo", "<p>You can <a href=\"" +
        userService.createLogoutURL(thisURL) +
        "\">sign out</a>.</p>");
    // 他の処理
} else {
    // ログインしていない場合の処理
    requestScope("loginInfo", "<p>Please <a href=\"" +
        userService.createLoginURL(thisURL) +
        "\">sign in</a>.</p>");
}

とりあえずrequestScopeにログインとログアウト用のリンクを突っ込んでます。JSPでは以下のように出力するだけ。

${loginInfo}

まず、ログインしているかどうかの判断はrequest.getUserPrincipal()がNULLかそうでないかで判断する。NULLでないならすでにログイン済みと判断する。
そして、ログインしている場合はuserService.createLogoutURL(thisURL)でログアウト用のリンクを作成。ログインしていない場合は、userService.createLoginURL(thisURL)でログイン用のリンクを作成している。
ここでログインまたはログアウトのリンクを押すと、Googleの方に処理が移ることになる。thisURLはその後の戻り先のURLを知らせるために設定しているのだと思う。
また、開発環境でもGoogleのログインをシミュレートしてくれるので、ローカル環境ではこんな感じに表示されました(↓)

ログイン前

sign inを押すと、開発環境用のログイン画面が現れる

Log Inボタンを押すと前の画面に戻ってログインが環境した状態になる。


で、この後、sign outを押してもログアウトされなかった。なんでかな。このアプリをappspot.comにデプロイしたときはログアウトできるんだけど、開発環境だとうまく行かないみたい。
ちなみに、ちゃんとappspot.comにデプロイしたときは以下のようなログイン画面が出てきます。

とりあえず、Googleアカウントを使ってのログイン・ログアウトを試したかったのであんまりいい例ではないけど、こんなに簡単にできますよ、、ってことで・・・。

あと、これではサーブレット毎(Slim3だとコントローラ毎)にこの処理を書かなきゃいけないので、面倒。なので、2つ目の方法、web.xmlにまとめてログインが必要か指定する方法。

	<security-constraint>
		<web-resource-collection>
			<url-pattern>/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>*</role-name>
		</auth-constraint>
	</security-constraint>

こう書くとすべてのアクセスにログインが必要になる。(http://localhost:8080/でアクセスしてもhttp://localhost:8080/todoでアクセスしても)使い方としてはこっちの方が多いかもね。
アプリケーション側ではログイン処理ってのは考えなくてよくて常にログインしているものとしてコードを記述すればよいだけになるので便利。
あ、でも、ログインしていない状態だと常にGoogleのログインページに行っちゃうからかっこ悪いかもね。せめてトップ画面くらいはログインなしでも見れないとダメかも。その場合はどうするんだろう・・。宿題。