Post 如何获取LinkedIn请求令牌?

Post 如何获取LinkedIn请求令牌?,post,oauth,linkedin,Post,Oauth,Linkedin,嘿,我正在尝试在PHP中使用LinkedIn的OAuth。我被困在获取请求令牌的第一步。我所知道的就是你将一些值发布到他们的服务器,然后取回你的令牌。因此,我将记录的参数发布到'https://api.linkedin.com/uas/oauth/requestToken我被打了个400分的错误 请求如下: $postArr = array(); //$postArr["oauth_callback"] = ""; idk they said this was optional... $post

嘿,我正在尝试在PHP中使用LinkedIn的OAuth。我被困在获取请求令牌的第一步。我所知道的就是你将一些值发布到他们的服务器,然后取回你的令牌。因此,我将记录的参数发布到'https://api.linkedin.com/uas/oauth/requestToken我被打了个400分的错误

请求如下:

$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);
我不认为我的帖子是正确的,但任何帮助都是非常感谢的——我只是不想求助于使用其他人的库来解决这个问题

-------编辑:每个James的输入尝试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);
詹姆斯编辑

尝试:


oauth\u consumer\u key
是LinkedIn应该为您的应用程序分配的值。你向他们登记了吗?
oauth\u nonce
对于每个请求都应该不同,以防止重播攻击。 如果您正在使用HMAC-SHA1,您需要自己添加
oauth\u签名
字段。手动创建签名是一个非常复杂的问题

还有很多Base64编码要做(还有一些特殊的OAuth怪癖)。我建议你读一下说明书


在上有一个测试服务器和客户端。当您在努力使协议正确时,它非常有用。

我在云九上。决定重新研究这个问题并使它起作用。下面是一些非常简单的PHP,用于为LinkedIn构建令牌请求(它输出一个锚定标记)



嘿,谢谢你,詹姆斯!是的,我在他们那里注册了:我会通过应用程序密钥。正如您可以清楚地看到的那样,我对传递给他们的API的确切内容感到很困难。但读了你说的话后,我现在觉得一切都有意义了:我已经不知所措了。现在,如果从头开始做这种恶作剧是不值得的,有没有其他(可接受的)宣誓签名方法的选择?无论如何,非常感谢链接,我会好好利用它。是的,你可以将它设置为纯文本而不是HMAC-SHA1,但是出于安全原因,服务器可能不支持它。(我没有与LinkedIn合作的经验)。好吧,我又试了一次,结果好多了(谢谢!)我仍然错过了一些关于这个过程的信息,因为回复说我的签名不好。我在遵循Vimeo概述的流程[很明显,你根据你的应用程序密码加密了整个请求并将其发送出去,你正在对oauth参数进行排序吗?刚刚看到你的编辑,你没有!按照字母顺序构造参数是最容易的。此外,“secret”需要有,并且&在最后,即使你还没有得到令牌。好吧,我遇到了一些问题这段代码在您实际发出api请求的最后一步。这是一个错误的签名,但它让我感到困惑,因为所有步骤都是相同的例程,其他签名工作得很好。结果,api请求url中有一个
~
字符。显然,这个字符不应该在基本字符串中进行url编码!!!在构建基字符串时,urlencode($endpoint)应更改为str_replace('%7E','~',rawurlencode($endpoint)),以帮助处理此问题。
//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&";
<?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/>"; 
?>