GAE/JでGoogleアカウントを使った認証を設定する

前回のログでは、Google App Engine/Java(GAE/J)でGoogleアカウントを使った簡単な認証サンプルを作成した。Googleアカウントによる認証には、この他に配備記述子(deployment descripter。web.xmlのこと)による認証が用意されている(GAE/Jへのマニュアルはこちら)。

マニュアルに書かれているように、web.xmlは以下のような形式で書けばよい(それと、appengine-web.xmlsessionを有効にしておく必要がある)。

<security-constraint>
    <web-resource-collection>
         <url-pattern>/profile/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
         <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

ここで

url-pattern 認証をかけたいリソースを、コンテキストパス以下のパスで定義する。ワイルドカード(*)指定ができる。
rolename adminか一般(*で指定)。adminはそのアプリケーションの管理者(=開発者)。管理者を増やしたい場合には、GAE/Jの管理メニューのDeveloperからinviteできる。

と定義する。
security-constraintのタグは、リソースに応じて複数定義できるが、開発者とそれ以外では応用性に欠ける。実際の開発局面では、以下のように全てのリソースに認証をかけてしまい、独自にロールを実装する必要があるだろう。

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


ためしに、上の定義で認証をかけて、HttpServletRequestの内容を覗いてみた結果が以下である。リクエストのやり方で異なってしまうが、RemoteUserはキチンと取得できる。AuthTypeはGOOGLE_AUTHという特殊な名前が入ってくる。

name value
AuthType GOOGLE_AUTH
Method GET
RemoteUser xxxxxxxxxx@gmail.com
RequestURI /xxxxx.xxx
ServletPath /xxxxx.xxx
ContentLength -1
Protocol HTTP/1.1
RemoteAddr xxx.xxx.xxx.xxx
RemoteHost xxx.xxx.xxx.xxx
Secure false
Scheme http
ServerName xxxxxxxxxx.appspot.com


ちなみに、appengine-web.xml

	<ssl-enabled>true</ssl-enabled>

としてSSLを有効にすると、HttpServletRequestの内容は以下のように変化する。ServerPortは、SSLが有効でない場合(SSLをかけない場合)には値が入らないが、ここではデフォルトのポートNo(443)が入ってくる。

name value
AuthType GOOGLE_AUTH
Method GET
RemoteUser xxxxxxxxxx@gmail.com
RequestURI /xxxxx.xxx
ServletPath /xxxxx.xxx
ContentLength -1
Protocol HTTP/1.1
RemoteAddr xxx.xxx.xxx.xxx
RemoteHost xxx.xxx.xxx.xxx
Secure true
Scheme https
ServerName xxxxxxxxxx.appspot.com
ServerPort 443