その1で一応 OAuth 認証は出来ているんだけど 公開鍵を使った認証ができるのでこれを試してみる。

最初、公開鍵を使うと consumer_key と consumer_secret で 2-legged で認証できると思っていたのだがどうやら出来ないならしい。
そもそも API がユーザを取得するようになっているので そういう物なんだろう。

鍵の準備

まず公開鍵を用意する。 現状、使えるのは RSA だけ。

openssl で鍵を作る。

  • http://code.google.com/intl/ja/apis/gdata/docs/auth/authsub.html#Registered
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 \
 -subj '/C=US/ST=CA/L=test/CN=wsjs-gae.appspot.com' \
 -keyout wsjs-gae_pri.pem -out wsjs-gae_pub.pem
subject は適当に修正が必要。

java は pkcs8 形式しか受け付けないので秘密鍵を変換する。

$ openssl pkcs8 -in wsjs-gae_pri.pem -out wsjs-gae_pri.pk8 -topk8 -nocrypt

サーバに公開鍵を登録

管理画面から公開鍵と登録する。

  • https://www.google.com/accounts/UpdateDomain

サーバ側の準備はこれだけ。

クライアント側に秘密鍵を指定

クライアント側で秘密鍵を使うコードは既にその1のコードに入っている。

	protected OAuthAccessor getOAuthAccessor() throws Exception {
		OAuthServiceProvider provider = 
			new OAuthServiceProvider(reqUrl, authUrl, accessUrl);
		OAuthConsumer consumer = 
			new OAuthConsumer(null, domain, consumerSecret, provider);

		String key = props.getProperty(PRIVATE_KEY);
		if (key != null) {
			EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(
				OAuthSignatureMethod.decodeBase64(key)
			);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			PrivateKey privateKey = keyFactory.generatePrivate(privKeySpec);
			consumer.setProperty(RSA_SHA1.PRIVATE_KEY, privateKey);
			consumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.RSA_SHA1);
		}

		return new OAuthAccessor(consumer);
	}

プロパティファイルに private_key を指定すると時動的に RSA_SHA1 モードに切り替わるようになっている。

鍵の準備で作成した pkcs8 の秘密鍵を設定する。

  • oauth.props:
app_id=wsjs-gae
consumer_secret=XXXXXXXXXXXXXXXXXXXXXXX
private_key=\
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALFqa/6eR/Eb8Jf8\
ftkuszfdjyybKeZXFBbnJejDjYc40wA9+kaEZbBwrFNCPFcRyF9+CCGbfkVKKvxH\
hpe+81xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxghxtTb\
VnKfhexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxZfL1C4\
OKEMI/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJ/Ngts\
EaP0YgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBi9jlS\
i6vZN0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxQG7eqM\
UN4pjJxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi8zjWZ\
3vt8Epxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0cEgB0\
8iu3AExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxR1OYlW\
SmWJbbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxexkVe+\
GVe9XRTSzVU5zIk70oTocR9qFwUZhMk1jzcNuNvTVZbPr7mPXhNhAkEArFu3d3eK\
csyGYG5+4e6QkYWkjce/xTdmt0YBdOLzyxMPcVZpUPxN75TBBDiLmpNAr2kRkWw5\
0VlVlA/KMbN+qQ==

これで その1 と同じ用に request、承認、access、目的URL と進めば RSA_SHA1 で 3-legged oauth で認証を行う事ができる。

2-legged 出来ないんでセキュリティが強化されただけで あんまり面白く無い。
しかも公開鍵登録しても HMAC-SHA1 でアクセス出来ちゃうし。