金利0無利息キャッシング – キャッシングできます

 | 

2009-10-28

mixiアプリのOAuth署名の検証

15:18 | mixiアプリのOAuth署名の検証 - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - mixiアプリのOAuth署名の検証 - 金利0無利息キャッシング – キャッシングできます

前回の記事が投げっぱなしジャーマンなので、親切丁寧にgadgets.io.makeRequestで署名付きリクエストを使った場合に付加されるOAuthの署名の検証方法を書きます。

Perlの場合です。

手順1

http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/require_servers

ここに書いてあるのは「-----BEGIN CERTIFICATE-----」で始まるX.509証明書で、Crypt::OpenSSL::RSAでそのままでは読めなかったので変換する。

use strict;
use Crypt::OpenSSL::CA;

my $mixi_ca =<<END;
-----BEGIN CERTIFICATE-----
.... mixiのページからコピペ ....
-----END CERTIFICATE-----
END

my $ca = Crypt::OpenSSL::CA::X509->parse($mixi_ca);
warn $ca->dump; # 何か色々表示される
print $ca->get_public_key->to_PEM; # 公開鍵を取り出す

なんかCrypt::OpenSSL::CAのテストがこけまくってたけどまあ動いたので良しとする。

Net::OAuthを使う場合

use strict;
use Net::OAuth;
use URI;
use Crypt::OpenSSL::RSA;

my $mixi_pubkey =<<END;
-----BEGIN PUBLIC KEY-----
.... 手順1で取り出した公開鍵 ....
-----END PUBLIC KEY-----
END

my $public_key = Crypt::OpenSSL::RSA->new_public_key($mixi_pubkey);
my $url = URI->new("mixiアプリから届いたリクエストのURL");
my $request = Net::OAuth->request("protected resource")->from_url(
    $url,
    request_method => "GET",
    request_url => $url,
    consumer_secret => "dummy", # 使わない
    token_secret => "dummy",    # 使わない
);
warn $request->signature_base_string; # signature base stringの確認
if ( $request->verify($public_key) ) {
    warn "OK"
} else {
    die "Signature verification failed";
}

validationで弾かれるので使用しないパラメータも入れないとダメだった。

OAuth::Liteを使う場合

use strict;

use URI;
use URI::QueryParam;
use OAuth::Lite::Util qw(create_signature_base_string);
use OAuth::Lite::ServerUtil;

my $mixi_pubkey = <<END;
-----BEGIN PUBLIC KEY-----
.... 手順1で取り出した公開鍵 ....
-----END PUBLIC KEY-----
END

my $url = URI->new("mixiアプリから届いたリクエストのURL");
my $util = OAuth::Lite::ServerUtil->new;
$util->support_signature_method("RSA_SHA1");
warn create_signature_base_string("GET", $url, $url->query_form_hash); # signature base stringの確認

if ( $util->verify_signature(
    method          => "GET",
    url             => $url,
    params          => $url->query_form_hash,
    consumer_secret => $mixi_pubkey,
) ) {
    warn "OK";
} else {
    die $util->errstr;
}

まとめ

  • これでコンテナが付加したopensocial_***なパラメータが正しいことが検証できます。
  • それ以外の「アプリ内で取得して外部に送るパラメータ」が改変されてないことが保障されるわけではありません。
  • 例えばアプリ内で自分のmixi idを取得して外部サーバーに送った場合に、そのmixi idを信頼するな。コンテナが付加したidを使え。
    • 検証しないのであれば、ユーザーから送られてくる自称idは信頼できない値なので、その程度の目的用途にしか使うべきではない。
 |