2011-10-31 7 views
1

안녕하세요, PHP에서 LinkedIn의 OAuth를 사용하려고합니다. 요청 토큰을 얻는 첫 번째 단계에서 멈추었습니다. 제가 아는 것은 서버에 값을 게시하고 토큰을 되 찾는 것입니다. 그래서 문서화 된 args를 'https://api.linkedin.com/uas/oauth/requestToken'에 게시하면 400 오류가 발생합니다. - 난 그냥 리조트는이 문제를 해결하기 위해 다른 사람의 라이브러리를 사용하지 않으려는 내 POST의 인수가 올바른지하지만 어떤 도움은 매우 감사합니다 생각하지 않습니다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); 

:

여기에 요청합니다.

------- 편집 : 제임스 입력 당 ATTEMPT 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

나는 구름 9 위에 있습니다. 이 문제를 재검토하고 작동하도록 결정했습니다. 다음은 LinkedIn에 대한 토큰 요청을 빌드하는 PHP입니다 (앵커 태그를 출력합니다)

<?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이 아닌 **입니다! 기본 문자열을 만들 때 **이 stir_replace ('% 7E', '~', rawurlencode ($ endpoint)) **로 변경해야 ** urlencode ($ endpoint) . –

1

oauth_consumer_key 링크드 앱에 할당해야하는 값이다. 그들과 함께 등록 했습니까? oauth_nonce은 재생 공격을 막기 위해 요청마다 달라야합니다. HMAC-SHA1을 사용하는 경우 oauth_signature 필드를 직접 추가해야합니다. 수동으로 서명을 만드는 것은 총 PITA입니다.

Base64 인코딩도 많이 있습니다 (일부 특수 OAuth 단점의 보너스가 추가됨). 당신이 사양을 읽을 것을 권합니다.

this link에는 테스트 서버와 클라이언트가 있습니다. 프로토콜을 올바르게 사용하기 위해 고심하고있을 때 매우 유용합니다.

+0

안녕하세요, James! 그래, 나는 그들과 함께 등록했다 : 나는 앱 키를 전달할 것이다. 당신이 명확하게 볼 수 있듯이, 나는 * 정확하게 * 그들의 API에 전달되는 것에 힘든 시간을 보냈다. 그러나 당신이 말한 것을 읽고 나면 지금 내게 의미가 있습니다. 나는 내 머리 위로 들어가 있습니다. 이제이 SHA1을 처음부터 수행하는 것이 가치가 없다면 oath_signature_method에 대한 또 다른 (수용 가능한) 옵션이 있습니까? 어쨌든 링크를 사용해 주셔서 감사합니다. –

+0

그래, HMAC-SHA1 대신 PLAINTEXT로 설정할 수 있지만 서버가 보안상의 이유로 지원하지 않을 수 있습니다. (LinkedIn에서 일한 경험이 없습니다.) – James

+0

좋아, 다시 시도해 보았는데, 훨씬 더 나은 결과를 얻었습니다. (감사합니다!) 답장으로 내 서명이 나쁘다고 말하면서 여전히 프로세스에 대해 빠져 있습니다. Vimeo [http://vimeo.com/api/docs/oauth]에 설명 된 프로세스를 따르면서 앱 비밀번호에 따라 전체 요청을 암호화하고 함께 전송합니다. –

관련 문제