【问题标题】:How do I get a LinkedIn request token?如何获取 LinkedIn 请求令牌?
【发布时间】:2016-02-16 19:21:55
【问题描述】:

嘿,我正在尝试在 PHP 中使用 LinkedIn 的 OAuth。我被困在获取请求令牌的第一步。我所知道的是您将一些值发布到他们的服务器并取回您的令牌。所以我将记录在案的 args 发布到“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);

我认为我的 POST 参数不正确,但非常感谢任何帮助——我只是不想求助于使用别人的库来解决这个问题。

-------编辑:根据詹姆斯的输入尝试 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&";

【问题讨论】:

    标签: post oauth linkedin


    【解决方案1】:

    我在云九。决定重新审视这个问题并让它发挥作用。这是一些非常简单的 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/>"; 
    ?>
    

    【讨论】:

    • 好的,在您实际发出 api 请求的最后一步,我遇到了一些问题。这是一个糟糕的签名,但它让我感到困惑,因为它对所有步骤都是相同的例程,而其他签名工作得很好。原来,api 请求 url 中有一个 ~ 字符。显然,这个字符 not 应该是在基本字符串中编码的 url !!!在构建基本字符串时,应将 urlencode($endpoint) 更改为 str_replace('%7E', '~', rawurlencode($endpoint)) 以提供帮助处理这个怪癖。
    【解决方案2】:

    oauth_consumer_key 是 LinkedIn 应该分配给您的应用的值。你在他们那里注册了吗? oauth_nonce 对于每个请求应该不同,以防止重放攻击。 如果您使用 HMAC-SHA1,您需要自己添加 oauth_signature 字段。手动创建签名是一个完整的 PITA。

    还有很多 Base64 编码要做(加上一些特殊的 OAuth 怪癖)。我建议你阅读规范。

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

    【讨论】:

    • 嘿,谢谢詹姆斯!是的,我向他们注册了:我将传递 App Key。正如您清楚地看到的那样,我很难处理究竟 传递给他们的API 的内容。但是在阅读了你所说的之后,这一切对我来说都是有意义的:我在我的头上。现在,如果从头开始做这个 SHA1 恶作剧是不值得的,那么 oath_signature_method 是否还有另一个(可接受的)选项?无论如何,非常感谢您提供的链接,我会好好利用它的。
    • 是的,您可以将其设置为 PLAINTEXT 而不是 HMAC-SHA1,但出于安全原因,服务器可能不支持此功能。 (我没有使用 LinkedIn 的经验)。
    • 好的,我又试了一次,结果好多了(谢谢!)我仍然错过了一些关于这个过程的东西,因为回复说我的签名很糟糕。我正在遵循 Vimeo [vimeo.com/api/docs/oauth] 概述的过程,显然您根据您的应用程序秘密加密了整个请求并将其发送出去
    • 你在排序oauth参数吗?
    • 刚刚看到您的编辑,但您没有!按字母顺序构造参数是最简单的。此外,即使您还没有获得令牌,“秘密”也需要在末尾加上 &。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多