我想借此在一個問題一個新的面貌,併發布新的數據
感謝@Jonny S I發現一些錯誤,並得到了另一個錯誤=)
所以,我流程現在看起來:
函數生成隨機數,附加信息:oauth_nonce in api,oauth.net
function generate_nonce() {
$mt = microtime();
$rand = mt_rand();
return md5($mt . $rand); // md5s look nicer than numbers
}
Implementing Sign in with Twitter(此鏈接向我們展示了,我們應該提前發佈了什麼頭),並顯示我們的方向移動 - POST oauth/request_token
此網頁的鏈接與oauth docs section 6.1
那裏,我們可以找到需要什麼樣的參數來請求令牌,但在官方文檔中,您不會在twitter API中找到「oauth_calback」參數,它是必需的參數!
下一步驟中,我做 - 收集所需PARAMS:
oauth_consumer_key
$oauth_consumer_key = 'YoUrS KEy FrOm aPP ApI';
oauth_nonce
$oauth_nonce = generate_nonce();
oauth_callback
$oauth_callback = 'http://twoends.home/backend';
oauth_sinature_method
$oauth_signature_method = 'HMAC-SHA1';
oauth_timestamp
$oauth_timestamp = time();
oauth_version
$oauth_version = '1.0';
附加段米(在過程中需要):
OAuth的簽名(最棘手的部分)
這裏我們對如何做到這一點Creating a signature
首先我們需要收集所有所需的PARAMS在一起的API頁面,百分比編碼和排序他們,我推他們陣列:
$params = array(
rawurlencode('oauth_consumer_key')=>rawurlencode($oauth_consumer_key),
rawurlencode('oauth_nonce')=>rawurlencode($oauth_nonce),
rawurlencode('oauth_callback')=>rawurlencode($oauth_callback),
rawurlencode('oauth_signature_method')=>rawurlencode($oauth_signature_method),
rawurlencode('oauth_timestamp')=>rawurlencode($oauth_timestamp),
rawurlencode('oauth_version')=>rawurlencode($oauth_version),
);
然後排序:
ksort($params);
然後我創建參數字符串:
$parameter_string = http_build_query($params,'','&');
結果:
PARAM字符串:oauth_callback = HTTP%253A%252F%252Ftwoends 。家裏%252Fbackend & oauth_consumer_key = oauth_consumer_key_wQjQ7u5lgwA & oauth_nonce = 46fa649c21ac5315d4d4510ff68a d630 & oauth_signature_method = HMAC-SHA1 & oauth_timestamp = 1381930918 & oauth_version = 1。0
下
我需要創建base_string,這將被用於創建簽名數據PARAM爲hash_hmac()函數
$base_string = strtoupper($http_method).'&';
$base_string .= rawurlencode($base_url).'&';
$base_string .= rawurlencode($parameter_string);
結果:
POST & HTTPS%3A %2F%2Fapi.twitter.com%2Foauth%2Frequest_token & oauth_callback%3Dhttp%25253A%25252F%25252Ftwoends.home%25252Fbackend%26oauth_consumer_key%3Dapp_cons_keyQjQ7u5lgwA%26oauth_nonce%3D46fa649c21 ac5315d4d4510ff68ad630%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1381930918%26oauth_version%3D1.0
下一個我從APP的設置獲得CONSUMER_SECRET創建將被用於創建簽名在hash_hmac第三PARAM簽名密鑰()函數
$oauth_consumer_secret = 'consumer_secret_from_app_settings';
$oauth_signing_key = rawurlencode($oauth_consumer_secret).'&';
一兩件事提:在第一步(request_token我們不需要把任何令牌)
此步驟創建簽名:
$oauth_signature = base64_encode(hash_hmac('sha1', $base_string, $oauth_signing_key, true));
現在我們需要添加簽名參數數組和構建頭字符串
$params['oauth_signature'] = rawurlencode($oauth_signature);
ksort($params);
建築物頭字符串可以在Building the header string
$DST ='OAuth ';
foreach($params as $key=>$value){
$DST .= $key.'='.'"'.$value.'", ';
}
$DST = rtrim($DST,', ');
//or we can make it by hand as below
//$DST .= 'oauth_nonce="'.rawurlencode($oauth_nonce)
// .'", oauth_callback="'.rawurlencode($oauth_callback)
// .'", oauth_signature_method="HMAC-SHA1", oauth_timestamp="'
// .rawurlencode($oauth_timestamp).'", oauth_consumer_key="'
// .rawurlencode($oauth_consumer_key).'", oauth_signature="'
// .rawurlencode($oauth_signature).'", oauth_version="1.0"';
的最後一步(我希望)是被發現發送請求:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $base_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: '.$DST));
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo '<pre>';
print_r($info);
echo '</pre>';
此代碼產生錯誤400 - 錯誤的請求
如果我刪除curl_setopt($ ch,CURLOPT_POST,true);我得到的錯誤 - 401
請求信息轉儲:
Array
(
[url] => https://api.twitter.com/oauth/request_token
[content_type] =>
[http_code] => 400
[header_size] => 66
[request_size] => 471
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.710993
[namelookup_time] => 0.081279
[connect_time] => 0.23482
[pretransfer_time] => 0.550913
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => -1
[starttransfer_time] => 0.710976
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 199.16.156.104
[certinfo] => Array
(
)
[primary_port] => 443
[local_ip] => 192.168.1.234
[local_port] => 54994
[request_header] => POST /oauth/request_token HTTP/1.1
Host: api.twitter.com
Accept: */*
Authorization: OAuth oauth_callback="http%3A%2F%2Ftwoends.home%2Fbackend", oauth_consumer_key="your_consumer_keyCwQjQ7u5lgwA", oauth_nonce="1ba83f0af239f439c1524096c33faefe", oauth_signature="QZZvrJ8wzCQOYhiKJeT4vz%2FWCcg%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1381931941", oauth_version="1.0"
Content-Length: -1
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
)
希望這將有助於瞭解在哪裏可以找到錯誤,事先我還會嘗試使用Fiddler跟蹤請求
--- ------------------------------------
使用新的API解決方案
1 - 我的錯誤,它存在,oauth_token也在那裏 - 我放棄它。 2 - 用你的替換籤名密鑰。 3 - 給$ params添加簽名''params ['oauth_signature'] = rawurlencode($ oauth_signature)''。結果:'[request_header] => GET/oauth/request_token HTTP/1。1個 主機:api.twitter.com 接受:*/* 授權:OAuth的oauth_callback = 「HTTP%3A%2F%2Ftwoends.home%2Fbackend」 &oauth_consumer_key = 「CONSUMER_KEY」 &oauth_nonce = 「45ed597e5456715d6880cf73d702a7df」 &oauth_signature =「5ap7idjtbcdlBAeAx3HSVQpLqBk%3D 「&oauth_signature_method =」HMAC-SHA1「&oauth_timestamp =」1381843238「&oauth_version =」1.0「'仍然失敗 – alexZT
正如我寫的答案 - 看到頭通過GET請求發送,添加了選項'curl_setopt($ ch,CURLOPT_POST,true);'現在我收到http錯誤 - 400,但沒有收到 - 「無法驗證oauth簽名和令牌」 – alexZT
我認爲我看到了問題。在授權標題中,參數應該用逗號和空格分隔,而不是與&符分開。 ($ DST。= $ key。'='。'''。$ value。',';) –