GAE/JでGoogleアカウントを使った認証を設定する
前回のログでは、Google App Engine/Java(GAE/J)でGoogleアカウントを使った簡単な認証サンプルを作成した。Googleアカウントによる認証には、この他に配備記述子(deployment descripter。web.xmlのこと)による認証が用意されている(GAE/Jへのマニュアルはこちら)。
マニュアルに書かれているように、web.xmlは以下のような形式で書けばよい(それと、appengine-web.xmlでsessionを有効にしておく必要がある)。
<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 |