SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Google App Engine for Javaを使ってみよう!

Google App Engine for Javaを使ってみよう!
(3)Google Accounts Java API

Google App Engine for Javaを使ってみよう! (3)

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>");
}
  1. UserServiceインスタンスを取得します。
  2. このサーブレットが実行されているウェブページのURIを取得します。
  3. このサーブレットにリクエストを出したプリンシパルを取得します(認証していない場合、null)。
  4. ログアウト用のGoogle AccountsのURLを取得します。
  5. ログイン用のGoogle AccountsのURLを取得します。

 (4)、(5)で取得できる「ログイン」や「ログアウト」のURLは「Google Accounts」の認証ページになっており、認証ページを含む、認証サービスのすべてを「Google Accounts」が肩代わりしてくれているのが分かります。開発者はUserServiceクラスから取得したGoogle AccountsのURLを利用することで、簡単にユーザを認証ページに誘導できます。

認証後にUserクラス経由で取得できる情報とメソッド名
目的 メソッド
認証ドメインの取得 getAuthDomain()
メールアドレスの取得 getEmail()
ニックネーム getNickname()
UserServiceから取得するGoogle AccountsのURL

 Google App Engine標準のappspot.comドメインで開発を進めて、後から独自ドメインにプログラムを移行する場合にも、UserServiceクラスのcreateLogoutURL()createLoginURL()から取得するURLは内部的に正しく動作するため、プログラムを修正することなくサービスの移行が可能です。

認証をローカルで実行してみる

com.daisukeyamashita.test.gaccountパッケージにあるGAccountTestServletを以下のように書き換えて下さい。

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」と表示されていることが確認できます。

次のページ
認証をGoogle App Engineで動かしてみる

この記事は参考になりましたか?

Google App Engine for Javaを使ってみよう!連載記事一覧

もっと読む

この記事の著者

山下 大介(ヤマシタ ダイスケ)

  京都大学を中心とした、産官学共同プロジェクトのSOBAプロジェクトに参加後、同プロジェクトで開発したP2P配信によるVoIP技術を2005年に商業化。オープンソース、VoIP、P2P、クラウドコンピューティングに精通。趣味はGoogleの追っかけ。現在は、株式会社SOBAプロジェクト取締役。ブログ:『~ ミネルヴァの梟は黄昏とともに飛び始める ~』所属:株式会社SOBAプロジェクトGoogle Developer Day 2008サポーター, 2009サポーターGoogle App Engine API Expert

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3840 2009/04/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー