2010-06-13

GAE/J の AuthSub で This website has not registered with Google to establish a secure connection for authorization requests. の警告をなくす方法

GAE アプリから、 AuthSub 認証を使って Blogger などのデータにアクセスする際に出る警告がこちら。
This website has not registered with Google to establish a secure connection for authorization requests. We recommend that you continue the process only if you trust the following destination:
(このウェブサイトは認証リクエストに対して保護された接続を確立するよう Google に登録されていません。次のサイトが信頼できる場合のみ処理を続行してください:)
これを出なくさせたいなと思って調べてみたら、こちらがヒット。 そのままズバリなので、これ以上書く必要もないのだけれど…まあ一応。

ウェブサイトの登録

まず にアクセスして、「Add a New Domain」で自分の GAE アプリのドメインを入力する。「Manage registration」に「Manage YOURAPP.appspot.com」のように、入力したドメインが表示されるので、それをクリック。

Google Accounts Authentication API - Terms and Conditions を確認して、「I agree to the Terms of Service」ボタンを押下。ウェブサイトの管理ページが開くので、「Target URL path prefix」に認証後のトークン送信先 URL を入力し「Save」を押すと、Google へのウェブサイト登録が完了。

(場合によっては、ウェブサイトの「所有権の確認」が要る場合も。メタタグをサイトに追加するか、指示されたファイルをアップロードするかして、ウェブサイトの所有権を確認。)

再び AuthSub 認証を使ってみると警告文が変わっているはず。
This website is registered with Google to make authorization requests, but has not been configured to send requests securely. We recommend that you continue the process only if you trust the following destination:
X.509 自己署名証明書

「Google に登録されてはいるけれど、セキュアじゃないよ。」に警告が変わったので、次はセキュアトークンを送ってもらうための準備。 を参考に、X.509 の Self-signing Certificate を取得。Java の keytool が便利だった。
# Generate the RSA keys and certificate
keytool -genkey -v -alias Example -keystore example
  -keyalg RSA -sigalg SHA1withRSA
  -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain  View, ST=CA, C=US"
  -storepass changeme -keypass changeme
keytool -export -rfc -keystore example -storepass changeme -alias Example -file mycert.pem
作成された PEM ファイルを、前節の Google アカウント情報「Upload new X.509 cert:」にアップロード。keystore は GAE の war に入れて、アップロード。しなきゃ認証時に java.io.FileNotFoundException が出ちゃう。

GAE 側の設定

Google Account Authentication API からセキュアトークンを受け取ったり、実際にデータをやりとりしたりする GAE のページを SSL に対応させる。

appengine-web.xml の appengine-web-app 要素内に
<ssl-enabled>true</ssl-enabled>
を追加。

お好みで web.xml に
<security-constraint>
 <web-resource-collection>
  <url-pattern>/authsub</url-pattern>
 </web-resource-collection>
 <user-data-constraint>
  <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 </user-data-constraint>
</security-constraint>
をつけ加え(/authsub アクセス時は常に https になる)。

プログラム

Google Accounts Authentication API へのアクセスを要求する場合、
String next = "https://YOURAPP.appspot.com/authsub";
String scope = "http://www.blogger.com/feeds/"; //blogger にアクセスする場合
boolean secure = true;
boolean session = true;
String authSubLogin = AuthSubUtil.getRequestUrl(next, scope, secure, session);
とすると、authSubLogin にログイン用の URL が入るので、それでページにリンクを作成してアクセスしてもらう。

セキュアトークンを受け取って、実際にデータにアクセスするには、
String query = req.getQueryString();
String token = AuthSubUtil.getTokenFromReply(query);
PrivateKey privateKey = AuthSubUtil.getPrivateKeyFromKeystore("example", "changeme", "Example", "changeme");
String sessionToken = AuthSubUtil.exchangeForSessionToken(token, privateKey);

GoogleService myService = new GoogleService("blogger", "APPLICATIONNAME");//blogger にアクセスする場合
myService.setAuthSubToken(sessionToken, privateKey);
という風にするといいみたい(例外処理は省略)。後はもう好きなように
URL feedUrl = new URL("http://www.blogger.com/feeds/default/blogs");
Feed resultFeed = myService.getFeed(feedUrl, Feed.class);
とかすると、ユーザーが管理している Blogger ブログ一覧のフィードが取得できたりするわけ。

あ、セキュアトークン受け取りの URL を https に変えると、Google アカウント情報に指定する「Target URL path prefix」も方も https に変えとかないとね。

これで警告がすべてなくなるはずなんだけれど…、少し前にやったのを思い出しながら書いたので、思い違いや書き忘れがあるかも。後はより詳しい人のツッコミに期待。
スポンサードリンク:

お願い:
「このエントリ役に立った!」と思ったら、ぜひ フィード 登録をお願いします。 

No comments:

Post a Comment

Comments on Google+:

Zenback - Everyone's Related Posts