Search code examples
postoauthlinkedin-api

How do I get a LinkedIn request token?


Hey I'm trying to use LinkedIn's OAuth in PHP. I'm stuck at the first step of getting a request token. All I know is you post some values to their server and get your token back. So i post the documented args to 'https://api.linkedin.com/uas/oauth/requestToken' and I get slapped with a 400 error.

here's the request:

$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);

I don't think my POST args are correct but ANY help is very appreciated -- I just don't want resort to use someone else's library to solve this.

-------EDIT: ATTEMPT 2 per James' input ---------

ok so here im making a call to the test link you sent me. i'm actually able to get a response back, but it doesnt like my signature (big surprise, i know). So just how bad did I screw up the encryption?

//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);

EDIT by James

Try:

//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&";

Solution

  • I'm on cloud nine. Decided to revisit this problem and got it to work. Here is some very bare bones PHP to build a token request for LinkedIn (it outputs an anchor tag)

    <?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/>"; 
    ?>