2011-04-03 21 views
5

Estoy intentando autorizar a los usuarios en mi sitio en base a un inicio de sesión de Soundcloud.Soundcloud (Oauth2) API que obtiene el token de acceso falla

Utiliza la autenticación Oauth.

El usuario tiene que hacer clic en un botón en mi sitio y se redirige al sitio de Soundcloud, donde se inicia la sesión.

Después de que el usuario es redireccionado de nuevo a mi sitio donde tengo que conseguir una accessToken.

Esta falla con el mensaje: La URL solicitada respondió con código HTTP 0.

He vertido el material rizo si lo necesita:

[data]; False 
[info][url]     : https://api.soundcloud.com/oauth2/token 
     [content_type]   ; NULL 
     [http_code]    : 0 
     [header_size]   : 0 
     [request_size]   : 0 
     [filetime]    : -1 
     [ssl_verify_result]  : 0 
     [redirect_count]   : 0 
     [total_time]    : 0.031 
     [namelookup_time]  : 0 
     [connect_time]   : 0.031 
     [pretransfer_time]  : 0 
     [size_upload]   : 0 
     [size_download]   : 0 
     [speed_download]   : 0 
     [speed_upload]   : 0 
     [download_content_length]: -1 
     [upload_content_length] : -1 
     [starttransfer_time]  : 0 
     [redirect_time]   : 0 
     [certinfo]    [] 

El código ejecuto:

$soundcloud = new SoundcloudModel('*****', '*****', '*****'); 

    try { 
     $accessToken = $soundcloud->accessToken($this->request['code']); 
    } catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) { 
     exit($e->getMessage()); 
    } 

El código API Soundcloud:

protected function _getAccessToken($postData, $curlOptions = array()) 
{ 
    $options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData); 
    $options += $curlOptions; 
    $response = json_decode(
     $this->_request($this->getAccessTokenUrl(), $options), 
     true 
    ); 

    if (array_key_exists('access_token', $response)) { 
     $this->_accessToken = $response['access_token']; 

     return $response; 
    } else { 
     return false; 
    } 
} 

protected function _request($url, $curlOptions = array()) 
{ 
    $ch = curl_init($url); 
    $options = $this->_curlOptions; 
    $options += $curlOptions; 

    if (array_key_exists(self::CURLOPT_OAUTH_TOKEN, $options)) { 
     $includeAccessToken = $options[self::CURLOPT_OAUTH_TOKEN]; 
     unset($options[self::CURLOPT_OAUTH_TOKEN]); 
    } else { 
     $includeAccessToken = true; 
    } 

    if (array_key_exists(CURLOPT_HTTPHEADER, $options)) { 
     $options[CURLOPT_HTTPHEADER] = array_merge(
      $this->_buildDefaultHeaders(), 
      $curlOptions[CURLOPT_HTTPHEADER] 
     ); 
    } else { 
     $options[CURLOPT_HTTPHEADER] = $this->_buildDefaultHeaders(
      $includeAccessToken 
     ); 
    } 

    curl_setopt_array($ch, $options); 

    $data = curl_exec($ch); 
    $info = curl_getinfo($ch); 

    print_r(array('ch'=>$ch, 'data'=>$data, 'info'=>$info)); 

    curl_close($ch); 

    $this->_lastHttpResponseHeaders = $this->_parseHttpHeaders(
     substr($data, 0, $info['header_size']) 
    ); 
    $this->_lastHttpResponseBody = substr($data, $info['header_size']); 
    $this->_lastHttpResponseCode = $info['http_code']; 

    if ($this->_validResponseCode($this->_lastHttpResponseCode)) { 
     return $this->_lastHttpResponseBody; 
    } else { 
     throw new Services_Soundcloud_Invalid_Http_Response_Code_Exception(
      null, 
      0, 
      $this->_lastHttpResponseBody, 
      $this->_lastHttpResponseCode 
     ); 
    } 
} 

Perdón por esta larga publicación, ¡espero que puedan ayudarme!

Respuesta

3

Lo tengo.

Descubrí que el cURL utilizado por PHP utiliza un paquete de cert desactualizado (al menos en Windows).

he descargado el último paquete de cert: http://curl.haxx.se/docs/caextract.html y añade la siguiente opción cURL:

curl_setopt($ch, CURLOPT_CAINFO, 'C:/absolute/path/to/cacert.pem'); 
Cuestiones relacionadas