Scala on GAE/Jでアカウント認証(1)

最近Scalaという関数型言語の勉強を始めました。
まだ言語の持つパワーについて知るところは少ないですが、何ができるのかと今からワクワクしています。

今回はGoogle App Engine for JavaGoogleの提供しているサービスの一つ、アカウント認証機能を使ってログイン・ログアウトをするだけのアプリケーションをScalaで書いてみました。

オペレーションとしては、以下のような感じになります。

  1. アプリケーショントップページにGoogleアカウント認証機能へのリンク
  2. リンクをクリックすると認証ページに遷移、手持ちのGoogleアカウントでログインする
  3. ログインに成功すれば"master"ディレクトリ配下に移動
  4. ログアウトをするとアプリケーショントップページに戻る

以下ソース。

LoginController.scala

package jp.tantack.nasg.controller

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

import javax.servlet.http.{HttpServlet
                           , HttpServletRequest => HSReq
                           , HttpServletResponse => HSResp}

class LoginController extends HttpServlet {

	override def doGet(req : HSReq, resp : HSResp) = {
	    var service : UserService = UserServiceFactory.getUserService();
	    var url : String = service.createLoginURL("/master/index.jsp");
	    
	    resp.sendRedirect(url);
	}

}

LogoutController.scala

package jp.tantack.nasg.controller

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

import javax.servlet.http.{HttpServlet
                           , HttpServletRequest => HSReq
                           , HttpServletResponse => HSResp}

class LogoutController extends HttpServlet {

	override def doGet(req : HSReq, resp : HSResp) = {
	    var service : UserService = UserServiceFactory.getUserService();
	    var url : String = service.createLogoutURL("/index.jsp");
	    
	    resp.sendRedirect(url);
	}

}

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>Login</servlet-name>
		<servlet-class>jp.tantack.nasg.controller.LoginController</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Login</servlet-name>
		<url-pattern>/login</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>Logout</servlet-name>
		<servlet-class>jp.tantack.nasg.controller.LogoutController</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Logout</servlet-name>
		<url-pattern>/logout</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

index.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
	<head>
		<title>アプリケーショントップページ</title>
	</head>
	<body>
		<p><a href="/login">ログインするよ!</a></p>
	</body>
</html>


/master/index.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
	<head>
		<title>ログイン後トップページ</title>
	</head>
	<body>
		<p>ログインしたよ!</p>
		<p><a href="/logout">ログアウトするよ!</a></p>
	</body>
</html>


内部的にはJavaサーブレットで動いているので、書き方もJavaのWebアプリケーションと同じですね。

実際に動かすためには、以下のような手順を踏みます。

  1. JDKを入手。
  2. Scalaを入手。
  3. 統合開発環境Eclipseを導入。
  4. Google Plugin for Eclipseを導入。
  5. Scala IDE for Eclipseを導入。
  6. Eclipseで新規GAE/Jプロジェクトを作成。
  7. できたプロジェクトの"/war/WEB-INF/lib"配下に、Scalaに含まれてる"scala-library.jar"を突っ込む。
  8. GAE/Jプロジェクトに「Scalaネイチャー」を付与する
  9. 拡張子".scala"のファイルが無事コンパイルされることを確認したら環境はOK!
  10. 小躍りしながら実装!実装!!

かなり端折った気もしますが、こんな感じです。

不備等があればガンガン突っ込んで下さい。