2011-03-09 15 views
6

tengo un problema al hacer una solicitud de API simple al Yammer (https://www.yammer.com/api_doc.html). Necesito obtener https://www.yammer.com/api/v1/groups.xml (Grupos: Una lista de grupos).Comprender OAuth con Perl

Estoy tratando de usar Net :: OAuth :: Simple. Aquí está mi Yammer.pm:

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; 

Y aquí está mi programa principal:

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($_); 

Estoy recibiendo mensajes como

Ir a https://www.yammer.com/oauth/authorize?oauth_token=2sxBkKW1F1iebF2TT5Y7g&callback=https%3A%2F%2Fwww.yammer.com%2Foauth%2Fauthorize%3Frand%3D0.0045166015625

Y autorizando la aplicación en esta URL. Después de eso me veo mensaje como:

Usted ha autorizado con éxito el siguiente aplicación: 2GIS_yammer

Para completar la autorización de volver a la aplicación 2GIS_yammer y escriba el siguiente código:

869A

Pero, ¿qué sigue? Donde debo ingresar este numero? ¿Cómo realizar la solicitud que necesito?

Gracias. romana

Respuesta

6

probablemente el número que se obtiene tras la etapa de autorización es la cadena deoauth_verifier que necesita ser enviado junto con el token de solicitud con el fin de obtener el token de acceso.

Esto es parte obligatoria de las implementaciones de oAuth 1.0a (que creo que es la implementación más común que se usa ahora, porque 2.0 todavía es un borrador y no hay muchas bibliotecas que lo implementen).

Supongo que no envía la URL de devolución de llamada al proveedor, y él no sabe dónde redirigir al usuario después de la autorización. Cuando el proveedor no conoce una URL de devolución de llamada, no puede redirigir al usuario a su aplicación (de consumidor). En ese caso, la especificación dice que debe imprimir la cadena del verificador en la pantalla, para que usted (el usuario) pueda tomarla manualmente y entregársela a su aplicación (del consumidor), y así crear la solicitud de ACCESS TOKEN.

Si proporciona una URL de devolución de llamada (en su primera solicitud de token de SOLICITUD), probablemente no obtenga la pantalla con este número, pero en su lugar, (el usuario) será redirigido a la URL de devolución de llamada con ella automáticamente.

E.g. si su url de devolución de llamada es: http://myapp.com/oauth/callback, el proveedor redirigirá al usuario a su url de devolución de llamada con los valores adecuados en la cadena de consulta.

redirección: http://myapp.com/oauth/callback?oauth_token=xxxx&oauth_verifier=yyyy

A continuación, la aplicación debe tener la cadena verificador y añadirlo como un parámetro para la solicitud de token de acceso (como lo ha hecho previamente con los otros parámetros como nonce, fecha y hora, oauth_token, etc.)

Como respuesta a esta última solicitud (con oauth_verifier cadena incluida) debe obtener ACCESS TOKEN.

Aquí hay una buena explicación acerca de la cadena deoauth_verifier y por qué se introdujo en el protocolo: http://hueniverse.com/2009/04/explaining-the-oauth-session-fixation-attack/

+0

Puede decirnos cómo hacer esto para 'Net :: OAuth :: Simple'? Intenté configurarlo con '$ app-> verifier ('869A')', pero parece erróneo. Y '$ app-> request_access_token ((oauth_verifier => $ pin));' tampoco funciona. – cringe