2010-06-12 7 views
2

저는 며칠 동안이 문제로 어려움을 겪었습니다. OAuth를 통해 LinkedIn에 연결하도록 테스트 앱을 설정했습니다. 사용자의 상태를 업데이트 할 수 있기를 원하지만 현재는 LinkedIn의 API와 전혀 상호 작용할 수 없습니다.LinkedIn API가 'Unauthorized'응답을 반환합니다 (PHP OAuth)

내가 성공적으로 다음 requestToken, accessToken을 얻을 수 있어요,하지만 난 API에 요청을 발행 할 때, 나는 이런 식으로 뭔가 보이는 '무단'오류 참조 :

object(OAuthException)#2 (8) { 
["message:protected"]=> string(73) "Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)" 
["string:private"]=> string(0) "" 
["code:protected"]=> int(401) 
["file:protected"]=> string(47) "/home/pmfeorg/public_html/dev/test/linkedin.php" 
["line:protected"]=> int(48) 
["trace:private"]=> array(1) { 
    [0]=> array(6) { 
    ["file"]=> string(47) "/home/pmfeorg/public_html/dev/test/linkedin.php" 
    ["line"]=> int(48) 
    ["function"]=> string(5) "fetch" 
    ["class"]=> string(5) "OAuth" 
    ["type"]=> string(2) "->" 
    ["args"]=> array(2) { 
    [0]=> string(35) "http://api.linkedin.com/v1/people/~" 
    [1]=> string(3) "GET" 
    } 
    } 
} 
["lastResponse"]=> string(358) " 401 1276375790558 0000 [unauthorized]. OAU:Bhgk3fB4cs9t4oatSdv538tD2X68-1OTCBg-KKL3pFBnGgOEhJZhFOf1n9KtHMMy|48032b2d-bc8c-4744-bb84-4eab53578c11|*01|*01:1276375790:xmc3lWhXJvLSUZh4dxMtrf55VVQ= " 
["debugInfo"]=> array(5) { 
["sbs"]=> string(329) "GET&http%3A%2F%2Fapi.linkedin.com%2Fv1%2Fpeople%2F~&oauth_consumer_key%3DBhgk3fB4cs9t4oatSdv538tD2X68-1OTCBg-KKL3pFBnGgOEhJZhFOf1n9KtHMMy%26oauth_nonce%3D7068001084c13f2ee6a2117.22312548%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1276375790%26oauth_token%3D48032b2d-bc8c-4744-bb84-4eab53578c11%26oauth_version%3D1.0" 
["headers_sent"]=> string(401) "GET /v1/people/~?GET&oauth_consumer_key=Bhgk3fB4cs9t4oatSdv538tD2X68-1OTCBg-KKL3pFBnGgOEhJZhFOf1n9KtHMMy&oauth_signature_method=HMAC-SHA1&oauth_nonce=7068001084c13f2ee6a2117.22312548&oauth_timestamp=1276375790&oauth_version=1.0&oauth_token=48032b2d-bc8c-4744-bb84-4eab53578c11&oauth_signature=xmc3lWhXJvLSUZh4dxMtrf55VVQ%3D HTTP/1.1 User-Agent: PECL-OAuth/1.0-dev Host: api.linkedin.com Accept: */*" 
["headers_recv"]=> string(148) "HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 Date: Sat, 12 Jun 2010 20:49:50 GMT Content-Type: text/xml;charset=UTF-8 Content-Length: 358" 
["body_recv"]=> string(358) " 401 1276375790558 0000 [unauthorized]. OAU:Bhgk3fB4cs9t4oatSdv538tD2X68-1OTCBg-KKL3pFBnGgOEhJZhFOf1n9KtHMMy|48032b2d-bc8c-4744-bb84-4eab53578c11|*01|*01:1276375790:xmc3lWhXJvLSUZh4dxMtrf55VVQ= " 
["info"]=> string(216) "About to connect() to api.linkedin.com port 80 (#0) Trying 64.74.98.83... connected Connected to api.linkedin.com (64.74.98.83) port 80 (#0) Connection #0 to host api.linkedin.com left intact Closing connection #0 " 
} 
} 

내 코드의 외모를 이 같은 (php.net에서 FireEagle 예 기준) :

$req_url = 'https://api.linkedin.com/uas/oauth/requestToken'; 
$authurl = 'https://www.linkedin.com/uas/oauth/authenticate'; 
$acc_url = 'https://api.linkedin.com/uas/oauth/accessToken'; 
$api_url = 'http://api.linkedin.com/v1/people/~'; 
$callback = 'http://www.pmfe.org/dev/test/linkedin.php'; 
$conskey = 'Bhgk3fB4cs9t4oatSdv538tD2X68-1OTCBg-KKL3pFBnGgOEhJZhFOf1n9KtHMMy'; 
$conssec = '####################SECRET KEY#####################'; 

session_start(); 

try { 
    $oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI); 
    $oauth->enableDebug(); 

    if(!isset($_GET['oauth_token'])) { 
    $request_token_info = $oauth->getRequestToken($req_url); 
    $_SESSION['secret'] = $request_token_info['oauth_token_secret']; 
    header('Location: '.$authurl.'?oauth_token='.$request_token_info['oauth_token']); 
    exit; 
    } else { 
    $oauth->setToken($_GET['oauth_token'],$_SESSION['secret']); 
    $access_token_info = $oauth->getAccessToken($acc_url); 
    $_SESSION['token'] = $access_token_info['oauth_token']; 
    $_SESSION['secret'] = $access_token_info['oauth_token_secret']; 
    } 
    $oauth->setToken($_SESSION['token'],$_SESSION['secret']); 
$oauth->fetch($api_url, OAUTH_HTTP_METHOD_GET); 

$response = $oauth->getLastResponse(); 
} catch(OAuthException $E) { 
    var_dump($E); 
} 

나는 성공적하여 OAuth를 사용하여 페이스 북에 트위터에 연결하고 하나를 설정했지만, 링크드 인은 저를 벗어난 유지합니다. 누군가가 조언을 해줄 수 있거나 올바른 방향으로 나를 가리킬 수 있다면, 나는 매우 감사 할 것입니다!

답변

0

LinkedIn에서 HTTP 상태 코드를 완전히 볼 수 없다면 401은 WWW-Authenticate 헤더 (즉 : base64 형식의 사용자 이름/비밀번호)가 필요하다는 것을 의미하므로 액세스하지 못합니다.

아마도 OAuth::setAuthType()을 수행해야합니다.

1

글쎄, 나는 문제의 원인을 찾았지만 새로운 문제가 지금있다 :

내 원래의 질문이 잘못 - 내가 전혀 accessToken을 받고되지 않았습니다. 문제는 getAccessToken 호출 중에 verifyToken 단계에서 얻은 검증 코드를 전달하지 않는다는 것입니다.

$access_token_info = $oauth->getAccessToken($acc_url); 

... 나는이 작업을 수행하는 데 필요한

그래서 오히려 이것보다

...

$_SESSION['verifier'] = $_GET['oauth_verifier']; 
$access_token_info = $oauth->getAccessToken($acc_url, $_SESSION['verifier'], $_SESSION['verifier']); 

나는이 정보를 다른 밖으로 사람을 도움이되기를 바랍니다. OAuth와 함께 작업 한 것은 이번이 처음이지만 LinkedIn은 매우 엄격한 구현 방식을 가지고있는 것 같습니다.

어쨌든 이제 내 상태를 업데이트하려고 시도 할 때 LI가 401을 반환하는 이유를 알아야합니다. 앱을 승인했으며 데이터를 가져올 수 있지만 데이터를 설정할 수 없습니다. 어딘가에 LI의 설정에 숨겨진 추가 사용 권한이 있습니까?

+0

LinkedIn은 응답 본문에 401에 대한 이유를 보냅니다. 그것은 무엇을 말하는가? –

+0

이전과 같은 응답 : 잘못된 인증 요청 (401, 예상 HTTP/1.1 20X 또는 리디렉션) –

관련 문제