Perl & Facebook json подписал_просмотр парсинга - PullRequest
0 голосов
/ 05 декабря 2011

Я пытаюсь проанализировать JSON Sign_Request, который вы получаете от Facebook в Perl, но мне нужна небольшая помощь!

($encoded_sig, $payload) = split('\.', $formdata{'signed_request'});
$sig  = decode_base64url($encoded_sig);
$data = decode_json(decode_base64url($payload));
%decoded = %{ decode_json(decode_base64url($payload)) };
$expected_sig = hmac_sha256($payload, $app_secret);

if ($expected_sig eq $sig) {
while (my ($key, $value) = each %decoded) { 
print "$key = $value\n<br>";
}
}

Каждое значение $ может содержать строку или ссылку на другой HASH (а некоторые из этих HASH могут содержать другой HASH), есть ли лучший способ обработать это?

Сценарий выше возвращает:

algorithm = HMAC-SHA256
page = HASH(0x632b100) 
issued_at = 1323081670 
user = HASH(0x632b150) 

и json, полученный после декодирования:

{"algorithm":"HMAC-SHA256","issued_at":1323081670,"page":{"id":"192130540873448","liked":true,"admin":true},"user":{"country":"gb","locale":"en_GB","age":{"min":21}}}

В идеале хотелось бы увидеть результат:

algorithm = HMAC-SHA256
page-id = 192130540873448
page-liked = true
page-admin = true
issued_at = 1323081670 
user-country = gb
user-locale = en_GB
user-age-min = 21 

Структура данных будет увеличиваться, поскольку после ответа авторизованного пользователя из Facebook будет предоставлено больше данных.

Большое спасибо

Ответы [ 3 ]

1 голос
/ 04 января 2012

Изначально я разместил URL с рабочим примером.Спасибо Брэду за то, что он указал, что здесь лучше предоставить код, поэтому я удалил URL и добавил следующий код:

#!/usr/bin/perl

use strict;
use CGI;
use MIME::Base64;
use JSON;
use Digest::SHA qw(hmac_sha256);

my $secret = '<secret>';

my $q = new CGI;
my $sreq = $q->param('signed_request');

eval {
    die 'not a signed_request' unless (defined $sreq);
    my ($esig, $pload) = split('\.', $sreq);
    $esig = decode_base64url($esig);
    my $vsig = hmac_sha256($pload, $secret);
    die 'invalid signature' unless ($esig eq $vsig);
    my $data = decode_json(decode_base64url($pload));
    print "Content-Type: text/html\n\n";
    if ($data->{'page'}->{'liked'} eq 'true') {
        print "Oh yeah, you liked me :-)";
    } else {
        print "No? why not? Please press the Like button";
    }
};
if ($@) {
    print "Content-Type: text/html\n\ndied: $@";
}

sub decode_base64url {
    my $s = shift;
    $s =~ tr[-_][+/];
    $s .= '=' while length($s) % 4;
    return decode_base64($s);
}

sub parse_hash {
    my $hash = shift;

    my $array = [];
    foreach my $key (keys %$hash) {
        if (ref($hash->{$key}) eq 'HASH') {
            push @$array, $key . ' => {' . join(', ', @{ parse_hash($hash->{$key}) }) . '}';
        } else {
            push @$array, $key . ' => ' . $hash->{$key};
        }
    }
    return $array;
}
0 голосов
/ 06 декабря 2011

Чтобы ответить на мой собственный вопрос:)

if ($expected_sig eq $sig) {
while (my ($key, $value) = each %decoded) { 
 if (ref($value) eq "HASH") {
 while ( my ($key2, $value2) = each(%{$value}) ) {
$mydata{"$key-$key2"}=$value2;
 if (ref($value2) eq "HASH") {
  while ( my ($key3, $value3) = each(%{$value2}) ) {
$mydata{"$key-$key2-$key3"}=$value3;
        print "$key-$key2-$key3 = $value3\n<br>";
}}
else
{
        print "$key-$key2 = $value2\n<br>";
}}}
else
{ 

$mydata{"$key"}=$value;
print "$key = $value\n<br>";
}}}

вывод:

algorithm = HMAC-SHA256 
page-admin = 1 
page-liked = 1 
page-id = 192130540873448   
issued_at = 1323081670    
user-country = gb 
user-locale = en_GB 
user-age-min = 21 
0 голосов
/ 05 декабря 2011

Единственный способ это:

$my_algorithm = $algorithm
$page-id = $page->{'id'};
$page-liked = $page->{'linked'};
$page-admin = $page->{'admin'};
$my_issued_at = $issued_at
$user-country = $user->{'country'};
$user-locale = $user->{'locale'};
$user-age-min = $user->{'age'}->{'min'};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...