2011-03-09 13 views
6

के साथ ओथ को समझना मुझे यमर (https://www.yammer.com/api_doc.html) के लिए सरल एपीआई अनुरोध करने में समस्या है। मुझे https://www.yammer.com/api/v1/groups.xml (समूह: समूहों की एक सूची) प्राप्त करने की आवश्यकता है।पर्ल

मैं नेट :: ओथ :: सरल का उपयोग करने की कोशिश कर रहा हूं।

package Yammer; 
use strict; 
use base qw(Net::OAuth::Simple); 
sub new { 
    my $class = shift; 
    my %tokens = @_; 
    return $class->SUPER::new(tokens => \%tokens, 
     urls => { 
      authorization_url => "https://www.yammer.com/oauth/authorize", 
      request_token_url => "https://www.yammer.com/oauth/request_token", 
      access_token_url => "https://www.yammer.com/oauth/access_token", 
     }, 
     protocol_version => '1.0a', 
    ); 
} 
sub view_restricted_resource { 

    my $self = shift; 
    my $url = shift; 
    return $self->make_restricted_request($url, 'GET'); 
} 
sub update_restricted_resource { 

    my $self   = shift; 
    my $url   = shift; 
    my %extra_params = @_; 
    return $self->make_restricted_request($url, 'POST', %extra_params);  
} 

1; 

यहाँ और अपने मुख्य कार्यक्रम है: यहाँ मेरी Yammer.pm है

use Yammer; 

# Get the tokens from the command line, a config file or wherever 
my %tokens = (

    consumer_key => 'Baj7MciMhmnDTwj6kaOV5g', 
    consumer_secret => 'ejFlGBPtXwGJrxrEnwGvdRyokov1ncN1XxjmIm34M', 
    callback => 'https://www.yammer.com/oauth/authorize', 

); 
my $app  = Yammer->new(%tokens); 
# Check to see we have a consumer key and secret 
unless ($app->consumer_key && $app->consumer_secret) { 
    die "You must go get a consumer key and secret from App\n"; 
} 

# If the app is authorized (i.e has an access token and secret) 
# Then look at a restricted resourse 
if ($app->authorized) { 
    my $response = $app->view_restricted_resource; 
    print $response->content."\n"; 
    exit; 
} 
# Otherwise the user needs to go get an access token and secret 
print "Go to " . $app->get_authorization_url(callback => 'https://www.yammer.com/oauth/authorize?rand=' . rand()) . "\n"; 
print "Then hit return after\n"; 
<STDIN>; 
my ($access_token, $access_token_secret) = $app->request_access_token($_); 

मैं की तरह

जाओ संदेश मिल रहा है https://www.yammer.com/oauth/authorize?oauth_token=2sxBkKW1F1iebF2TT5Y7g&callback=https%3A%2F%2Fwww.yammer.com%2Foauth%2Fauthorize%3Frand%3D0.0045166015625

को और इस यूआरएल पर आवेदन अधिकृत।

आप सफलतापूर्वक निम्नलिखित आवेदन अधिकृत किया है:: 2GIS_yammer

प्राधिकरण को पूरा करने के 2GIS_yammer आवेदन करने के लिए वापस जाने के लिए और निम्न कोड दर्ज करें: उसके बाद मैं संदेश की तरह देख

869A

लेकिन अगला क्या है? मुझे इस नंबर को दर्ज करना होगा? मुझे अनुरोध करने का अनुरोध कैसे करें?

धन्यवाद। रोमन

उत्तर

6

शायद नंबर आपको प्राधिकरण कदम के बाद प्राप्त oauth_verifier स्ट्रिंग है कि आदेश पहुंच टोकन प्राप्त करने में अनुरोध टोकन के साथ भेजे जाने की आवश्यकता है।

यह ओथ 1.0 ए कार्यान्वयन का अनिवार्य हिस्सा है (जो मुझे लगता है कि अब सबसे आम कार्यान्वयन है, क्योंकि 2.0 अभी भी एक मसौदा है और इसमें कई पुस्तकालय शामिल नहीं हैं)।

मुझे लगता है कि आप प्रदाता को कॉलबैक यूआरएल नहीं भेजते हैं, और वह नहीं जानता कि प्राधिकरण के बाद उपयोगकर्ता को रीडायरेक्ट करना है। जब प्रदाता कॉलबैक यूआरएल नहीं जानता है, तो वह उपयोगकर्ता को आपके (उपभोक्ता) एप्लिकेशन पर वापस रीडायरेक्ट नहीं कर सकता है। उस स्थिति में विनिर्देश कहता है कि इसे स्क्रीन पर सत्यापनकर्ता स्ट्रिंग मुद्रित करनी चाहिए, इसलिए आप (उपयोगकर्ता) इसे मैन्युअल रूप से ले सकते हैं और इसे अपने (उपभोक्ता) एप्लिकेशन को दे सकते हैं, और इसलिए एक्सेस टोकन के अनुरोध को बनाने के लिए।

यदि आप कॉलबैक यूआरएल (अनुरोध टोकन के लिए आपके पहले अनुरोध में) प्रदान करते हैं, तो शायद आपको इस नंबर के साथ स्क्रीन नहीं मिलेगी, लेकिन इसके बजाय, आप (उपयोगकर्ता) को इसके साथ कॉलबैक यूआरएल पर रीडायरेक्ट कर दिया जाएगा खुद ब खुद।

उदा। यदि आपका कॉलबैक यूआरएल है: http://myapp.com/oauth/callback, तो प्रदाता क्वेरी स्ट्रिंग में उचित मानों के साथ उपयोगकर्ता को आपके कॉलबैक यूआरएल पर रीडायरेक्ट करेगा।

पुन: निर्देश: http://myapp.com/oauth/callback?oauth_token=xxxx&oauth_verifier=yyyy

फिर अपने आवेदन सत्यापनकर्ता स्ट्रिंग लेने के लिए और पहुँच टोकन के लिए अनुरोध करने के लिए एक पैरामीटर के रूप में जोड़ें (जैसा कि आप अस्थायी रूप से, टाइमस्टैम्प, oauth_token, आदि जैसे अन्य मानकों के साथ पहले से किया जाना चाहिए)

इस अंतिम अनुरोध के जवाब के रूप में (oauth_verifier स्ट्रिंग शामिल है) आपको एक्सेस टोकन प्राप्त करना चाहिए।

यहाँ oauth_verifier स्ट्रिंग के बारे में एक अच्छा विवरण है और क्यों यह प्रोटोकॉल में पेश किया गया: http://hueniverse.com/2009/04/explaining-the-oauth-session-fixation-attack/

+0

आप हमें बताएँ कि 'Net :: OAuth :: Simple' के लिए यह करने के लिए कर सकते हैं? मैंने इसे '$ ऐप-> सत्यापनकर्ता ('869 ए') के साथ सेट करने का प्रयास किया, लेकिन यह गलत लगता है। और '$ ऐप-> request_access_token ((oauth_verifier => $ पिन)); 'या तो काम नहीं करता है। – cringe