GAE/JでGoogleアカウントを使う(Userオブジェクト)

先のログ「GAE/JでGoogleアカウントを使った認証を実装する」に登場した、UserServiceオブジェクト(APIドキュメント)を使うと、User(APIドキュメント英文のAPIの方が少しだけ詳しい)というオブジェクトが取得できる。サンプルを少しだけ修正して、画面に表示してみた。

サンプル

画面は以下。ログイン後、メソッド名と一緒にその値を表示している。


以下の作業は、GAE/JをインストールしたGalileo(Eclipse3.5)で行った。

プロジェクトの作成

先のログ「GAE/JでGoogleアカウントを使った認証を実装する」で作成したプロジェクトをコピーする。バージョンなどを変えたければ、プロジェクトを右クリックし、「Google => App Engine Settings ...」で変更する。

サーブレットの作成

先のログと同様にサーブレットで処理をする。コードは以下のようにした。

GaeLogin2Servlet.java

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.User;
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();

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

        if (request.getUserPrincipal() != null) {
            response.getWriter().println("<p>こんにちは、" +
                                         usr.getNickname() +
                                         "さん <a href=\"" +
                                         userService.createLogoutURL(thisURL) +
                                         "\">ログアウト</a>.</p><br><br>");
            response.getWriter().println("<table border=1>");
            response.getWriter().println("<tr><th>getAuthDomain</th>");
            response.getWriter().println("<td>"+usr.getAuthDomain()+"</td></tr>");
            response.getWriter().println("<tr><th>getEmail</th>");
            response.getWriter().println("<td>"+usr.getEmail()+"</td></tr>");
            response.getWriter().println("<tr><th>getNickname</th>");
            response.getWriter().println("<td>"+usr.getNickname()+"</td></tr>");
            response.getWriter().println("<tr><th>getUserid</th>");
            response.getWriter().println("<td>"+usr.getUserId()+"</td></tr>");
            response.getWriter().println("<tr><th>Hashcode</th>");
            response.getWriter().println("<td>"+usr.hashCode()+"</td></tr>");
            response.getWriter().println("</table>");
            
        } else {
            response.sendRedirect(userService.createLoginURL(thisURL));
        }
    }
}

index.html

これはそのままにしておく。初期画面は以下となって、リンクをクリックすると認証処理に引っかかる。

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Hello App Engine</title>
  </head>

  <body>
    <h1>Hello App Engine!</h1>
	
    <table>
      <tr>
        <td colspan="2" style="font-weight:bold;">Available Servlets:</td>        
      </tr>
      <tr>
        <td><a href="gaelogin"/>GaeLogin</td>
      </tr>
    </table>
  </body>
</html>

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
	<servlet>
		<servlet-name>GaeLogin</servlet-name>
		<servlet-class>test.GaeLogin2Servlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>GaeLogin</servlet-name>
		<url-pattern>/gaelogin</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

デプロイ

以上ができたら、GAE/Jにデプロイする。