oAuthRequest returns 空数组
oAuthRequest returns empty array
我为网站创建了一个 Twitter 应用程序。我想将记录 in/registering 的可能性与 Twitter 集成。我使用 php 文件作为助手,分别命名为 TwitterOAuth.php 和 OAuth.php。当用户单击 Twitter 按钮时,he/she 被重定向到名为 twitter.php 的页面,该页面具有以下源代码:
<?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.';
}
Common::twitter()
函数如下:
/**
* 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;
}
在我测试的场景中,else 分支被执行。但是,我得到一个例外:
Exception 'PHPErrorException' with message 'Notice [8] Undefined
index: oauth_token Error on line 81 in file ...\lib\TwitterOAuth.php
出现问题的函数如下:
/**
* 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;
}
问题是 OAuthUtil::parse_parameters($request)
returns 一个空数组。这种情况正在发生,因为 $request
是 false
,然而,$this->requestTokenURL
是 https://api.twitter.com/oauth/request_token,$parameters
有一个 oauth_callback
,它持有回调 URL 在 Twitter 应用程序中定义。这个问题的原因可能是什么?
编辑:
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());
}
}
这个方法在TwitterOAuth.php.
里面
在OAuth.php的get_normalized_http_url
方法中有一个代码块,即:
$port = @$parts['port'];
这导致了一些错误,所以我已经修复了它:
$port = (array_key_exists('port', $parts) ? $parts['port'] : 80);
但是,显然端口号 80 是问题所在,在我将块更改为此之后:
$port = (array_key_exists('port', $parts) ? $parts['port'] : 443);
它就像一个咒语。
我为网站创建了一个 Twitter 应用程序。我想将记录 in/registering 的可能性与 Twitter 集成。我使用 php 文件作为助手,分别命名为 TwitterOAuth.php 和 OAuth.php。当用户单击 Twitter 按钮时,he/she 被重定向到名为 twitter.php 的页面,该页面具有以下源代码:
<?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.';
}
Common::twitter()
函数如下:
/**
* 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;
}
在我测试的场景中,else 分支被执行。但是,我得到一个例外:
Exception 'PHPErrorException' with message 'Notice [8] Undefined index: oauth_token Error on line 81 in file ...\lib\TwitterOAuth.php
出现问题的函数如下:
/**
* 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;
}
问题是 OAuthUtil::parse_parameters($request)
returns 一个空数组。这种情况正在发生,因为 $request
是 false
,然而,$this->requestTokenURL
是 https://api.twitter.com/oauth/request_token,$parameters
有一个 oauth_callback
,它持有回调 URL 在 Twitter 应用程序中定义。这个问题的原因可能是什么?
编辑:
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());
}
}
这个方法在TwitterOAuth.php.
里面在OAuth.php的get_normalized_http_url
方法中有一个代码块,即:
$port = @$parts['port'];
这导致了一些错误,所以我已经修复了它:
$port = (array_key_exists('port', $parts) ? $parts['port'] : 80);
但是,显然端口号 80 是问题所在,在我将块更改为此之后:
$port = (array_key_exists('port', $parts) ? $parts['port'] : 443);
它就像一个咒语。