2010-11-11 21 views
5

Estoy usando PECL OAuth cuando trato de autenticar a una API.OAUTH usando PECL OAUTH de PHP - ¿No puede usar POST cuando usa el método getRequestToken()?

Código de ejemplo:

<?php 

$requestUri = 'http://openapi.lovefilm.com/oauth/request'; 

$consumerKey = 'MYCONSUMERKEY'; 
$consumerSecret = 'MYSECRET'; 

$oauth = new OAuth($consumerKey, $consumerSecret); 

$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION); 
$oauth->setVersion('1.0'); 
$oauth->setTimestamp(mktime()); 


$oauth->enableDebug(); 

try 
{ 
    $req = $oauth->getRequestToken($requestUri, 'oob'); 
    var_dump($req); 
} 
catch(OAuthException $e) 
{ 
    print '<pre>'; 
    var_dump($e); 

    var_dump($oauth->debugInfo); 
} 

?> 

La especificación que proporcionan (http://developer.lovefilm.com/ - Registro de req) dice que debería enviar una solicitud similar a la de abajo:

de POST/oauth/request_token HTTP/1.1 Host: openapi.lovefilm.com Autorización: OAuth oauth_callback = "http% 3A% 2F% 2Fyour-service.com% 2Fsuccess", oauth_consumer_key = "2blu7svnhwkzw29zg7cwkydn", OUA th_nonce = "5f38dbc02a97567965f14d", oauth_signature = "sPSVmqN% 2FXu9k0wlZxF0PqPZwYGo% 3D", oauth_signature_method = "HMAC-SHA1", oauth_timestamp = "1278499295", oauth_version = "1.0"

Sin embargo cuando se utiliza la la método:

$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION); 

La solicitud que se genera siempre es un GET.

¿Alguien puede ayudar?

Gracias,

Ben

Respuesta

2

Sí, de acuerdo con el OAuth Specification, the request for Temporary Credentials (AKA "Request Token")the request for Token Credentials (AKA "Access Token") y debe ser presentado como un HTTP POST petición, pero la extensión PECL OAuth parece utilizar persistentemente GET para getRequestToken() y getAccessToken() ... por defecto.

Hay an $auth_type parameter to OAuth::__construct() que acepte one of the following values:

  • OAUTH_AUTH_TYPE_AUTHORIZATION - Presentar los parámetros de OAuth en la cabecera HTTP Authorization de la solicitud (y el uso de una solicitud GET por defecto).
  • OAUTH_AUTH_TYPE_URI - Envíe los parámetros OAuth en el URI de solicitud (es decir, parámetros de consulta en una solicitud GET).
  • OAUTH_AUTH_TYPE_FORM - Envíe los parámetros OAuth como parte del cuerpo HTTP POST (en una solicitud POST).
  • OAUTH_AUTH_TYPE_NONE - No envíe ningún parámetro de OAuth, es decir, una solicitud "NoAuth" (también GET por defecto).

Desde mi experiencia, la fetch(), getRequestToken() y métodos getAccessToken() todo respeto este ajuste, which can also be set with OAuth::setAuthType() en una instancia del objeto.En la práctica, establezco el tipo de autenticación en OAUTH_AUTH_TYPE_FORM mientras realizo el baile, luego restablezco al valor predeterminado - OAUTH_AUTH_TYPE_AUTHORIZATION - para realizar solicitudes de recursos.

0

Es un poco extraño que están pidiendo específicamente para POST cuando no hay nada en el cuerpo de la entrada en el ejemplo que diste! ¿Funciona cuando se trata de una solicitud GET? Estaría tentado de hacer ping a su soporte técnico y preguntar qué está pasando allí. Si se requiere POST, es posible que deba ensamblar la solicitud manualmente en lugar de usar el PECL, lo cual es bastante posible pero bastante tedioso.

+0

Busqué SPEC: –

+0

'La documentación del proveedor de servicios especifica el método HTTP para esta solicitud, y HTTP POST es RECOMENDADO. ' –

+0

^^ Desde Oauth Spec en tokens de solicitud. (en una nota al margen parece presionar 'devolver' cuando se escribe en este cuadro lo envía). ¡Que molesto! –

0

Una forma de solucionarlo es utilizar OAuth::fetch en lugar de OAuth::getRequestToken y OAuth::getAccessToken.

$oauth = new OAuth('consumer_key', 'consumer_secret'); 
$oauth->fetch(
    'https://example.com/oauth/request_token', 
    array(), 
    OAUTH_HTTP_METHOD_POST 
); 
parse_str($oauth->getLastResponse(), $token_pair); 
0

El uso de OAUTH_AUTH_TYPE_FORM es solo una solución.

Pecl's oauth extension version 1.2.3 tiene a bug; getRequestToken y getAccessToken usan solicitudes GET en lugar de POST como RFC desea.

Puede solucionar este error pasando OAUTH_HTTP_METHOD_POST como el 3er parámetro a getRequestToken y el 4º parámetro a getAccessToken. Sí, esos parámetros are undocumented.


La versión 1.2.4 de pecl/oauth se configurará por defecto en POST.

Cuestiones relacionadas