X

Googleアカウントでユーザ認証する

GAEの機能の一つ、ユーザ認証を紹介します。Googleアカウントを利用してアクセスを制限できるため簡単かつアカウント管理の手間をなくすことが出来ます。

ユーザ認証機能を使うと上記のように、Google Accountサービスのログインシステム(画面)を利用できます。
当然、Googleアカウントで管理しているログインパスワードなどはサーバー管理者へは通知されず、管理者はユーザ名とemailアドレス、IDを受け取ることが可能です。
サンプルコードは続きからどうぞ

プロジェクト構成

今回のサンプルプロジェクトでは、ユーザ認証を行うページを/userauth、認証のための設定をweb.xmlで行っています。

ユーザ認証をする場合は/userauthにアクセスしますが、まず認証システムを使う設定をweb.xmlで行います。
web.xmlでは、認証のためsecurity-constraint要素を記述する必要があります。
■war/WEB-INF/web.xml

<web-app>
・・・省略・・・
	<servlet>
		<servlet-name>UserAuth</servlet-name>
		<servlet-class>org.techbooster.sample.gae.userauth.UserAuthServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>UserAuth</servlet-name>
		<url-pattern>/userauth</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>

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

		<auth-constraint>
			<role-name>*</role-name>
		</auth-constraint>
	</security-constraint>
</web-app>

16行目:security-constraint要素内で、認証が必要なweb-resource-collection要素(この場合は/user/auth/以下全てへのアクセスは認証が必要)を設定しています。
22行目:auth-constraint要素では、認証に必要な権限を示します。adminが指定されていればadmin権限をもったユーザのみ認証されます。今回は*指定しているため、どんなユーザでも認証さえ行えばアクセスすることが可能です

サンプルコード

それでは、実際に認証用のページ/userauthを確認してみましょう。UserServiceをつかってユーザ認証を行います。

■UserAuthServlet.java

@SuppressWarnings("serial")
public class UserAuthServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		resp.setContentType("text/plain;charset=UTF-8");

		//ユーザーサービスの取得
		UserService us = UserServiceFactory.getUserService();
		User user = us.getCurrentUser();

		if(user == null){
			resp.getWriter().println("ログインしていません");
		}else{
			resp.getWriter().println("ログイン状態です");
			resp.getWriter().println("認証ドメイン:" + user.getAuthDomain());
			resp.getWriter().println("ニックネーム:" + user.getNickname());
			resp.getWriter().println("ユーザID    :" + user.getUserId());
			resp.getWriter().println("Eメール     :" + user.getEmail());
		}
	}
}

8行目:UserServiceFactoryからUserServiceインスタンスを取得します。ユーザー情報はUserServiceインスタンスのgetCurrentUserメソッドを用いて取得します。
11行目:ユーザー情報を格納するUserインスタンスがnullであればログインしていない状態です。Userインスタンスが取得できれば認証できています。
ドメイン、ユーザーのニックネームなどを画面に表示しています。
ログイン状態であれば以下のように表示されます。

アカウント情報が個人情報であることを十分考慮し、必要以上に取得しないように注意してください。

ログイン画面への遷移

上記のサンプルコードでは、ログイン画面がありませんでした。
前述のサンプルコードではUserServiceインスタンスのgetCurrentUserメソッドをつかっています。
Userインスタンスを取得した結果がnullであれば未ログインだと簡易的に判定していました。

次は認証されていない状況の場合、以下のようなログイン画面を表示してログインを誘導してみましょう。

未ログイン時には、ログイン画面へのリンクを追加するようにサンプルコードを変更します。
■UserAuthServlet.java

・・・省略・・・
		//ユーザーサービスの取得
		UserService us = UserServiceFactory.getUserService();
		User user = us.getCurrentUser();

		if( us.isUserLoggedIn() == false ){
			resp.getWriter().println("ログインしていません");
			String url = us.createLoginURL("/userauth");
			resp.getWriter().println("<a herf ='"+ url + "'>ログイン</a>");
		}
・・・省略・・・

6行目:UserServiceクラスのisUserLoggedInメソッドを利用して、ログイン状態を確認します。
8行目:ログイン画面に誘導するURLを生成します。ここでの第1引数はログイン後に帰ってくるURLです。今回は/userauthにredirectを要求しています(つまり、同じページに戻ってきます)。
これで未ログインだった場合はログインというリンクが表示されて、ログイン画面に遷移できるようになります。

以上、おつかれさまでした。

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org