Google Accounts Java APIを使ってみよう!
Google App Engineの「Google Accounts Java API」は、簡単にGoogle Accountsの認証機構をあなたのサービスに組み込むことができます。
まずは、ログイン/ログアウトの処理をするソースコードを見てみましょう。
UserService userService = UserServiceFactory.getUserService(); // (1)
PrintWriter out = response.getWriter();
String thisURL = request.getRequestURI(); // (2)
Principal principal = request.getUserPrincipal(); // (3)
if (principal != null) {
String urlLogout = userService.createLogoutURL(thisURL); //(4)
out.println("<p>" + principal.getName() + "<a href=\"" + urlLogout + "\">ログアウト</a></p>");
} else {
String urlLogin = userService.createLoginURL(thisURL); // (5)
out.println("<p><a href=\"" + urlLogin + "\">ログイン</a></p>");
}
- UserServiceインスタンスを取得します。
- このサーブレットが実行されているウェブページのURIを取得します。
- このサーブレットにリクエストを出したプリンシパルを取得します(認証していない場合、null)。
- ログアウト用のGoogle AccountsのURLを取得します。
- ログイン用のGoogle AccountsのURLを取得します。
(4)、(5)で取得できる「ログイン」や「ログアウト」のURLは「Google Accounts」の認証ページになっており、認証ページを含む、認証サービスのすべてを「Google Accounts」が肩代わりしてくれているのが分かります。開発者はUserServiceクラスから取得したGoogle AccountsのURLを利用することで、簡単にユーザを認証ページに誘導できます。
| 目的 | メソッド |
| 認証ドメインの取得 | getAuthDomain() |
| メールアドレスの取得 | getEmail() |
| ニックネーム | getNickname() |
Google App Engine標準のappspot.comドメインで開発を進めて、後から独自ドメインにプログラムを移行する場合にも、UserServiceクラスのcreateLogoutURL()/createLoginURL()から取得するURLは内部的に正しく動作するため、プログラムを修正することなくサービスの移行が可能です。
認証をローカルで実行してみる
com.daisukeyamashita.test.gaccountパッケージにあるGAccountTestServletを以下のように書き換えて下さい。
package com.daisukeyamashita.test.gaccount;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.*;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
@SuppressWarnings("serial")
public class GAccountTestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
UserService service = UserServiceFactory.getUserService();
PrintWriter out = resp.getWriter();
String thisURL = req.getRequestURI();
if (req.getUserPrincipal() != null) {
User user = service.getCurrentUser();
out.println("<p>Google App Engine : " + req.getUserPrincipal().getName()
+ " <a href=\"" + service.createLogoutURL(thisURL) + "\">logout</a></p>");
out.println("isAdmin:" + service.isUserAdmin() + "<br />");
out.println("domain:" + user.getAuthDomain() + "<br />");
out.println("mail:" + user.getEmail() + "<br />");
out.println("nickname:" + user.getNickname() + "<br />");
} else {
out.println("<p><a href=\"" + service.createLoginURL(thisURL) + "\">login</a></p>");
}
}
}
これで認証サービスを実行する準備ができました。まずは、プログラムをEclipseから実行してローカルでの動きを確認します。
前回と同じように、プロジェクト名を右クリックして、[Run As]-[Web Application]をクリックします。

Consoleウィンドウに以下のように表示されればローカルサーバの起動が完了です。好きなブラウザで「http://localhost:8080/」にアクセスしてみましょう。

[GAccountTestServlet]をクリックします。

認証を開始するために、[login]をクリックします。

以下のような、ローカルテスト用の認証ページが表示されます。この認証ページは、Google App Engine上で実行する時には、GMailなどと同じ「Google Accounts」の認証画面になります。ローカルテスト用の認証画面では、[Email:]に適当な文字列(メールアドレスでなくても良い)を入力し、[Log In]をクリックします。

このように表示されていればOKです。一般ユーザとしてログインしたので、「isAdmin:false」と表示されていることを確認してください。次は、管理者としてログインしてみましょう。右上の[logout]をクリックしてログアウトします。

[login]をクリックして認証ページに移動します。管理者としてログインするには、[Sign in as Administrator]にチェックを入れる必要があります。チェックが入っていることを確認して、[Log In]をクリックします。

今度は、管理者としてログインしたので、「isAdmin:true」と表示されていることが確認できます。

