2015-12-18 1 views
-1

J'ai créé une application Twitter pour un site Web. Je voudrais intégrer la possibilité de se connecter/s'inscrire avec Twitter. J'utilise des fichiers php comme assistants, qui s'appellent respectivement TwitterOAuth.php et OAuth.php. Lorsqu'un utilisateur clique sur le bouton Twitter, il/elle est redirigé vers une page appelée twitter.php, qui a la source de code suivant:oAuthRequest renvoie un tableau vide

<?php 

/* Build TwitterOAuth object with client credentials. */ 
$connection = Common::twitter(); 

/* Get temporary credentials. */ 
$request_token = $connection->getRequestToken(App::env()->get('url')); 

/* Save temporary credentials to session. */ 
$token = $request_token['oauth_token']; 
$_SESSION['twitter'] = array('id' => $request_token['oauth_token'], 'token' => $request_token['oauth_token_secret']); 

/* If last connection failed don't display authorization link. */ 
switch ($connection->http_code) { 
    case 200: 
    /* Build authorize URL and redirect user to Twitter. */ 
    $url = $connection->getAuthorizeURL($token); 
    header('Location: ' . $url); 
    break; 
    default: 
    /* Show notification if something went wrong. */ 
    var_dump($request_token); 
    echo 'Could not connect to Twitter. Refresh the page or try again later.'; 
} 

La fonction Common::twitter() se présente comme suit:

/** 
* Returns the twitter OAuth service. 
* 
* @return TwitterOAuth 
*/ 
public static function twitter() { 
    if (!self::$tw) { 
     if ((User::isLoggedIn()) && (User::current()->hasTwitterAccount())) { 
      self::$tw = new TwitterOAuth(
       App::env()->get('twitter', 'consumerKey'), 
       App::env()->get('twitter', 'consumerSecret'), 
       App::CurrentUser()->getTwitterId(), 
       App::CurrentUser()->getTwitterUserAccessToken() 
      ); 
     } else { 
      self::$tw = new TwitterOAuth(
       App::env()->get('twitter', 'consumerKey'), 
       App::env()->get('twitter', 'consumerSecret') 
      ); 
     } 
    }   

    return self::$tw; 
} 

Dans le scénario que je suis en train de tester, la branche else est exécutée. Cependant, je reçois une exception:

Exception 'PHPErrorException' message « avis [8] Undefined index : Erreur oauth_token sur la ligne 81 dans le fichier ... \ lib \ TwitterOAuth.php

la fonction où le problème se produit est la suivante:

/** 
    * Get a request_token from Twitter 
    * 
    * @returns a key/value array containing oauth_token and oauth_token_secret 
    */ 
    function getRequestToken($oauth_callback) { 
    $parameters = array(); 
    $parameters['oauth_callback'] = $oauth_callback; 
    $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters); 
    $token = OAuthUtil::parse_parameters($request); 
    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
    return $token; 
    } 

le problème est que OAuthUtil::parse_parameters($request) retourne un tableau vide. Cela se produit, car $request est false, cependant, $this->requestTokenURL est https://api.twitter.com/oauth/request_token, $parameters a un oauth_callback, qui contient l'URL de rappel définie dans l'application Twitter. Quelle pourrait être la cause de ce problème?

EDIT:

Source of `$this->oAuthRequest`: 

    /** 
    * Format and sign an OAuth/API request 
    */ 
    function oAuthRequest($url, $method, $parameters) { 
    if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) { 
     $url = "{$this->host}{$url}.{$this->format}"; 
    } 
    $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters); 
    $request->sign_request($this->sha1_method, $this->consumer, $this->token); 
    switch ($method) { 
    case 'GET': 
     return $this->http($request->to_url(), 'GET'); 
    default: 
     return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata()); 
    } 
    } 

Ce procédé est à l'intérieur de TwitterOAuth.php.

+0

Vous avez oublié d'ajouter la source de '$ this-> oAuthRequest' –

+0

@AlexBlex, merci pour l'observation, j'ai ajouté la méthode à la question. –

+0

@AlexBlex, ce n'est pas un projet Drupal et le problème est indépendant de Drupal. –

Répondre

0

En OAuth.php il y avait un morceau de code dans la méthode get_normalized_http_url, à savoir:

$port = @$parts['port']; 

Cela a causé quelques erreurs, j'ai donc fixé comme ceci:

$port = (array_key_exists('port', $parts) ? $parts['port'] : 80); 

Cependant, apparemment numéro de port 80 était le problème et après avoir changé le morceau à ceci:

$port = (array_key_exists('port', $parts) ? $parts['port'] : 443); 

ça a marché comme un sort.