2011-10-31 121 views
1

嘿,我正在嘗試在PHP中使用LinkedIn的OAuth。我被困在獲取請求令牌的第一步。我所知道的是你發佈一些值到他們的服務器,並讓你的令牌回來。因此,我將記錄的參數發佈到'https://api.linkedin.com/uas/oauth/requestToken',我得到了一個400錯誤。如何獲得LinkedIn請求令牌?

這裏的要求:

$postArr = array(); 
//$postArr["oauth_callback"] = ""; idk they said this was optional... 
$postArr["oauth_consumer_key"] = "ForBritishEyesOnly"; //is this the application secret key or the api key? 
$postArr["oauth_nonce"] = "UltraRandomNonceFTW"; 
$postArr["oauth_timestamp"] = time(); 
$postArr["oauth_signature_method"] = "HMAC-SHA1"; //lolwut 
$postArr["oauth_version"] = "1.0"; 

$params = array('http'=>array('method'=>'post','content'=>http_build_query($postArr))); 
$context = stream_context_create($params); 
$stream = file_get_contents('https://api.linkedin.com/uas/oauth/requestToken', false, $context); 

我不認爲我的帖子ARG遊戲正確的,但任何幫助是非常讚賞 - 我只是不想再打用別人的庫來解決這個問題。

-------編輯:嘗試2元詹姆斯的輸入---------

確定,所以在這裏進行即時給你送我的測試環節的呼叫。我是,實際上能夠得到迴應,但它不喜歡我的簽名(大驚喜,我知道)。那麼我搞砸了加密有多糟糕?

//setup GET args 
$url = "http://term.ie/oauth/example/request_token.php?"; 
$url .= "oauth_version=1.0&"; 
$url .= "oauth_nonce=" . rand(0, 100000) . "&"; 
$url .= "oauth_timestamp=" . time() . "&"; 
$url .= "oauth_consumer_key=key&"; 
$url .= "oauth_signature_method=HMAC-SHA1&"; 

//encrypt the request according to 'secret' 
$sig = urlencode(base64_encode(hash_hmac("sha1", $url, "secret"))); 

//append the url encoded signature as the final GET arg 
$url .= "oauth_signature=" . $sig; 

//do it to it 
echo file_get_contents($url); 

編輯由詹姆斯

嘗試:

//setup GET args 
$url = "http://term.ie/oauth/example/request_token.php?"; 
$url .= "oauth_consumer_key=key&"; 
$url .= "oauth_nonce=" . rand(0, 100000) . "&"; 
$url .= "oauth_signature_method=HMAC-SHA1&"; 
$url .= "oauth_timestamp=" . time() . "&"; 
$url .= "oauth_version=1.0&"; 

回答

2

我在雲九。決定重新審視這個問題並讓它工作。這裏有一些非常簡單的PHP爲LinkedIn構建令牌請求(它輸出一個錨標籤)

<?php 
$endpoint = "https://api.linkedin.com/uas/oauth/requestToken"; 
$key = "YourAPIKey"; 
$secret = "YourAPISecret"; 
$params = array( 
    "oauth_version" => "1.0", 
    "oauth_nonce" => time(), 
    "oauth_timestamp" => time(), 
    "oauth_consumer_key" => $key, 
    "oauth_signature_method" => "HMAC-SHA1" 
); 
function SortedArgumentString($inKV) 
{ 
    uksort($inKV, 'strcmp'); 
    foreach ($inKV as $k => $v) 
     $argument[] = $k."=".$v; 
    return implode('&', $argument); 
} 
$baseString = "GET&" . urlencode($endpoint) . "&" . urlencode(SortedArgumentString($params)); 
$params['oauth_signature'] = urlencode(base64_encode(hash_hmac('sha1', $baseString, $secret."&", TRUE))); 
echo "<a href=\"" . $endpoint . "?" . SortedArgumentString($params) . "\">Get Token<a/><br/>"; 
?> 
+0

好吧,我在最後一步你遇到了一些麻煩,在這裏你實際上發出了api請求。這是一個不好的簽名,但它讓我感到困惑,因爲它對所有步驟都是相同的例程,其他簽名工作得很好。原來,api請求url中有一個'〜'字符。顯然,這個字符是**不是**應該是在基本字符串中的URL編碼! 當基礎字符串正在構建時,應該將** urlencode($ endpoint)**改爲** str_replace('%7E','〜',rawurlencode($ endpoint))**來幫助處理這個怪癖。 –

1

oauth_consumer_key是LinkedIn應該分配給您的應用程序的值。你有註冊嗎? oauth_nonce應該不同於每個請求以防止重放攻擊。 如果您使用的是HMAC-SHA1,則需要自行添加oauth_signature字段。手動創建簽名是一個總PITA。

還有很多Base64編碼要做(具有一些特殊的OAuth怪癖的附加獎勵)。我建議你閱讀規範。

有一個測試服務器和客戶端在this link。當你努力爭取正確的協議時,它非常有用。

+0

嘿謝謝詹姆斯!是的,我註冊了他們:我會通過應用密鑰。因爲你可以清楚地看到,我正在很難將*正確*傳遞給他們的API。但是在閱讀你所說的話之後,現在對我來說都是有道理的:我頭腦發昏。現在如果從頭開始這樣做SHA1 shenanigans是不值得的,那麼oath_signature_method是否有另一個(可接受的)選項?無論如何,非常感謝這個鏈接,我會很好的使用它。 –

+0

是的,你可以將它設置爲PLAINTEXT而不是HMAC-SHA1,但是出於安全原因,服務器可能不支持這個。 (我沒有使用LinkedIn的經驗)。 – James

+0

好的,我再次嘗試了一次,結果更好(謝謝!)我仍然錯過了關於該過程的一些信息,因爲迴應說我的簽名不好。我正在按照Vimeo [http://vimeo.com/api/docs/oauth]概述的過程,顯然你根據你的應用祕密加密了整個請求,然後發送這個請求 –