Php 另一个twitter oAuth cURL访问令牌请求失败
以下函数给出验证错误,而不是令牌: 无法验证oAuth签名和令牌Php 另一个twitter oAuth cURL访问令牌请求失败,php,curl,twitter,Php,Curl,Twitter,以下函数给出验证错误,而不是令牌: 无法验证oAuth签名和令牌 功能请求\u令牌() { //设置url $url=$this->site.$this->request\u token\u path;//http://api.twitter.com/oauth/request_token //要传递到twitter并创建签名的参数 $params['oauth\u consumer\u key']=$this->consumerKey; $params['oauth_token']=''; $
功能请求\u令牌()
{
//设置url
$url=$this->site.$this->request\u token\u path;//http://api.twitter.com/oauth/request_token
//要传递到twitter并创建签名的参数
$params['oauth\u consumer\u key']=$this->consumerKey;
$params['oauth_token']='';
$params['oauth_nonce']=SHA1(time());
$params['oauth_timestamp']=time();
$params['oauth\u signature\u method']=$this->signatureMethod;//HMAC-SHA1;
$params['oauth_version']=$this->version;//1.0
ksort($params);
//打印“”;打印($params);打印“”;
//创建签名
$concatatedParams='';
foreach($k=>v的参数){
$concatenatedParams.=“{$k}={$v}&”;
}
$concatatedParams=substr($concatatedParams,0,-1);
$signatureBaseString=“POST&.”.urlencode($url)。“&”.urlencode($concatatedParams);
$params['oauth_signature']=base64_编码(hash_hmac('SHA1',$signatureBaseString,$this->secret.&',TRUE));
//卷曲
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLINFO_HEADER_OUT,0);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组('Expect:');
curl_setopt($ch,CURLOPT_头,1);
卷曲设置($ch,卷曲设置桩,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$params);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
$exec=curl\u exec($ch);
$info=curl\u getinfo($ch);
卷曲关闭($ch);
打印$exec;
//打印“”;打印($info);打印“”;
}
我承认这不是一个真正的答案,但如果可以,请使用PECL OAuth包。这让我想起了同一个问题。下面是我到目前为止总结的内容,它是有效的:-)
我不确定你是否还在研究这个问题,或者它是否适合你,但我有一个类似的设置,也有同样的问题。我最终发现我是一到很多次的。 请尝试注释此部分:
我也遇到了同样的问题,我缺少的是将头传递给curl请求。如本问题所示,我还发送了$header=array('Expect:'),这就是我的问题所在。我开始发送签名头和其他数据如下,它解决了我的情况
只是一个提醒。Twitter与oAuth之间存在问题。这可能不是你的问题。谢谢-我不认为这是…好!它是有效的,在getRequestToken方法的末尾有一个“print”而不是“return”。我正试图用C#(不懂PHP)来实现这一点,所以我有点困惑。var$secret是来自twitter的消费者密钥吗?我有点晚了,但是如果(is#array($input)){return array#map(array)){code>if(is#array($input))有什么意义呢('Twitauth','uUrlEncode_rfc3986'),$input);除非您按照Holy Moly的其他说明操作,否则这不起作用!谢谢!我一直在寻找一个不用cURL就可以使用的函数,我只是删除了
\uHTTP
函数中的所有内容,并将其替换为$response=file\u get\u contents($url)
让我惊讶的是,它居然奏效了!!应该修改他的帖子,谢谢你对他的答案的洞察!
function request_token()
{
// Set url
$url = $this->site.$this->request_token_path; // http://api.twitter.com/oauth/request_token
// Params to pass to twitter and create signature
$params['oauth_consumer_key'] = $this->consumerKey;
$params['oauth_token'] = '';
$params['oauth_nonce'] = SHA1(time());
$params['oauth_timestamp'] = time();
$params['oauth_signature_method'] = $this->signatureMethod; // HMAC-SHA1;
$params['oauth_version'] = $this->version; // 1.0
ksort($params);
//print "<pre>"; print_r($params); print "</pre>";
// Create Signature
$concatenatedParams = '';
foreach($params as $k => $v){
$concatenatedParams .= "{$k}={$v}&";
}
$concatenatedParams = substr($concatenatedParams,0,-1);
$signatureBaseString = "POST&".urlencode($url)."&".urlencode($concatenatedParams);
$params['oauth_signature'] = base64_encode(hash_hmac('SHA1', $signatureBaseString, $this->secret."&", TRUE));
// Do cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLINFO_HEADER_OUT, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
$exec = curl_exec ($ch);
$info = curl_getinfo($ch);
curl_close ($ch);
print $exec;
//print "<pre>"; print_r($info); print "</pre>";
}
class Twitauth
{
var $key = '';
var $secret = '';
var $request_token = "https://twitter.com/oauth/request_token";
function Twitauth($config)
{
$this->key = $config['key']; // consumer key from twitter
$this->secret = $config['secret']; // secret from twitter
}
function getRequestToken()
{
// Default params
$params = array(
"oauth_version" => "1.0",
"oauth_nonce" => time(),
"oauth_timestamp" => time(),
"oauth_consumer_key" => $this->key,
"oauth_signature_method" => "HMAC-SHA1"
);
// BUILD SIGNATURE
// encode params keys, values, join and then sort.
$keys = $this->_urlencode_rfc3986(array_keys($params));
$values = $this->_urlencode_rfc3986(array_values($params));
$params = array_combine($keys, $values);
uksort($params, 'strcmp');
// convert params to string
foreach ($params as $k => $v) {$pairs[] = $this->_urlencode_rfc3986($k).'='.$this->_urlencode_rfc3986($v);}
$concatenatedParams = implode('&', $pairs);
// form base string (first key)
$baseString= "GET&".$this->_urlencode_rfc3986($this->request_token)."&".$this->_urlencode_rfc3986($concatenatedParams);
// form secret (second key)
$secret = $this->_urlencode_rfc3986($this->secret)."&";
// make signature and append to params
$params['oauth_signature'] = $this->_urlencode_rfc3986(base64_encode(hash_hmac('sha1', $baseString, $secret, TRUE)));
// BUILD URL
// Resort
uksort($params, 'strcmp');
// convert params to string
foreach ($params as $k => $v) {$urlPairs[] = $k."=".$v;}
$concatenatedUrlParams = implode('&', $urlPairs);
// form url
$url = $this->request_token."?".$concatenatedUrlParams;
// Send to cURL
print $this->_http($url);
}
function _http($url, $post_data = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
if(isset($post_data))
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
$response = curl_exec($ch);
$this->http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$this->last_api_call = $url;
curl_close($ch);
return $response;
}
function _urlencode_rfc3986($input)
{
if (is_array($input)) {
return array_map(array('Twitauth', '_urlencode_rfc3986'), $input);
}
else if (is_scalar($input)) {
return str_replace('+',' ',str_replace('%7E', '~', rawurlencode($input)));
}
else{
return '';
}
}
}
$keys = $this->_urlencode_rfc3986(array_keys($params));
$values = $this->_urlencode_rfc3986(array_values($params));
$params = array_combine($keys, $values);
$header = calculateHeader($parameters, 'https://api.twitter.com/oauth/request_token');
function calculateHeader(array $parameters, $url)
{
// redefine
$url = (string) $url;
// divide into parts
$parts = parse_url($url);
// init var
$chunks = array();
// process queries
foreach($parameters as $key => $value) $chunks[] = str_replace('%25', '%', urlencode_rfc3986($key) . '="' . urlencode_rfc3986($value) . '"');
// build return
$return = 'Authorization: OAuth realm="' . $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '", ';
$return .= implode(',', $chunks);
// prepend name and OAuth part
return $return;
}
function urlencode_rfc3986($value)
{
if(is_array($value)) return array_map('urlencode_rfc3986', $value);
else
{
$search = array('+', ' ', '%7E', '%');
$replace = array('%20', '%20', '~', '%25');
return str_replace($search, $replace, urlencode($value));
}
}