signed_requestからページ情報を取り出す

Facebookアプリを登録して、リンクを踏むとアプリへsigned_requestが送られてきます。

で、そこから情報を取り出す方法をメモ。

Apps on Facebook.com
http://developers.facebook.com/docs/guides/canvas/#auth

公式(上記)には、PHPのサンプルが載ってるんですが、Perl版が載ってない。。

CPANにFacebook::Signedってモジュールがあるんで、

use Facebook::Signed;
my $signed_request = 'signed_request'; # POSTで受け取る
my $secret = 'アプリの秘訣(笑)';
my $signed = Facebook::Signed->new( secret => $secret );
my $data = $signed->check_canvas_payload( $signed_request );

ってやれば、取れるはずなんですが、、JSONでエラーが。

多分、Perlのバージョンが悪い気がするけど、深追いしたくないので、

use Digest::SHA qw/hmac_sha256/;
use MIME::Base64::URLSafe;
use JSON;
use Data::Dumper;
my $signed_request = 'signed_request'; # POSTで受け取る
my $secret = 'アプリの秘訣(笑)';
my ($encoded_sig, $payload) = split('\.', $facebook_data);
my $sig  = urlsafe_b64decode($encoded_sig);
my $data = decode_json(urlsafe_b64decode($payload));
my $expected_sig = hmac_sha256($payload, $app_secret);
if ($sig eq $expected_sig) {
print Dumper $data;
}
else {
print 'error' . "\n";
}

とりあえず、Facebook::Signedからcheck_canvas_payloadだけ取り出してみた。

これで、$data->{‘page’}->{‘id’}で、アクセス元のfacebookページのidが取れる。

他に何が入ってるかは、Dumpした中身を見ればいいんじゃないですかねw