向 LinkedIn API 发出请求会导致 401

Posted

技术标签:

【中文标题】向 LinkedIn API 发出请求会导致 401【英文标题】:Making request to LinkedIn API results in 401 【发布时间】:2015-03-20 07:47:26 【问题描述】:

我正在尝试使用 phpAPI 添加到 LinkedIn 用户个人资料。 我已经成功注册了我的应用程序,并记录了我的 API 和密钥,并列出了我的重定向 url。

用户在此页面上开始:index.php。此页面包含指向linkedIn 对话框的链接:

<a href="https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=<?php echo $api_key ?>&state=<?php echo $state ?>&redirect_uri=<?php echo $redirect_uri ?>">Apply Now</a>

当我单击此链接时,我使用我的详细信息登录 LinkedIn,并成功重定向到 application_form.php。从这里我现在想获取用户个人资料的详细信息:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.linkedin.com/v1/people/~");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
var_dump($output);

但是上面的代码导致了这个输出:

"401 Unknown authentication scheme"

在做了一些研究之后,我认为这可能是因为我此时还没有获得访问令牌?有人知道我应该怎么做才能解决这个问题吗?

【问题讨论】:

我不知道你是否已经获得了一个访问令牌——但你肯定没有在你的 cURL 请求中使用一个。 @CBroe 我确实有一个access_token 我可以在网址code=MY_ACCESS_TOKEN 中看到它。我想我不确定如何在我的 cURL 请求中使用它。 他们的文档中有很多 PHP 代码示例,所以我建议你去看看。 我一直在寻找,但他们提供的示例代码似乎是通过交换授权代码来获取令牌。我正在尝试通过将用户重定向到 LinkedIn 的授权对话框来生成授权代码,他们没有提供我所看到的示例...... developer.linkedin.com/documents/code-samples 示例中的函数getAuthorizationCode 正是这样做的——构建登录 URL 并将用户重定向到那里…… 【参考方案1】:

对于正在阅读本文并希望使用LinkedIn Profile API 的任何人,我的问题的解决方案是我在尝试发出第一个请求时没有有效的Access Token

我做的第一件事是创建一个链接,将用户定向到LinkedIn 身份验证对话框。

接下来,用户将选择批准或拒绝我访问其个人资料的申请请求。不管他们选择什么,他们都会被重定向到我的redirect url

从这里我现在有一个access code,我可以用它来请求一个access token,从而进行api调用。

if (isset($_GET['error'])) 
    echo $_GET['error'] . ': ' . $_GET['error_description'];
 elseif (isset($_GET['code'])) 
    getAccessToken();
    //$user = fetch('GET', '/v1/people/~:(firstName,lastName)');//get name
    //$user = fetch('GET', '/v1/people/~:(phone-numbers)');//get phone numbers
    $user = fetch('GET', '/v1/people/~:(location:(name))');//get country
    var_dump($user);

我使用的getAccessToken()方法基于LinkedIn开发者网站上的代码

https://developer.linkedin.com/documents/code-samples

 function getAccessToken() 
    $params = array(
        'grant_type' => 'authorization_code',
        'client_id' => 'MY API KEY',
        'client_secret' => 'MY SECRET KEY',
        'code' => $_GET['code'],
        'redirect_uri' => 'MY REDIRECT URL',
    );
    // Access Token request
    $url = 'https://www.linkedin.com/uas/oauth2/accessToken?' . http_build_query($params);
    // Tell streams to make a POST request
    $context = stream_context_create(
            array('http' =>
                array('method' => 'POST',
                )
            )
    );
    // Retrieve access token information
    $response = file_get_contents($url, false, $context);
    // Native PHP object, please
    $token = json_decode($response);
    // Store access token and expiration time
    $_SESSION['access_token'] = $token->access_token; // guard this! 
    $_SESSION['expires_in'] = $token->expires_in; // relative time (in seconds)
    $_SESSION['expires_at'] = time() + $_SESSION['expires_in']; // absolute time
    return true;

然后是 fetch() 方法,同样来自 LinkedIn API

function fetch($method, $resource, $body = '') 
    $opts = array(
        'http' => array(
            'method' => $method,
            'header' => "Authorization: Bearer " . 
            $_SESSION['access_token'] . "\r\n" . 
            "x-li-format: json\r\n"
        )
    );
    $url = 'https://api.linkedin.com' . $resource;
    if (count($params)) 
        $url .= '?' . http_build_query($params);
    
    $context = stream_context_create($opts);
    $response = file_get_contents($url, false, $context);
    return json_decode($response);

通过上述操作,我向API 发出请求没有问题。为了公平起见,上面评论的 Cbroe。我错过了这些信息。如果他/她想留下答案,我很乐意接受,但以防万一我已经为遇到我遇到的问题的任何人提供了我的解决方案。

【讨论】:

以上是关于向 LinkedIn API 发出请求会导致 401的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 https://api.thetvdb.com/ 向 TVDB REST API 发出 JSON POST 请求,但出现 CORS 错误

LinkedIn V2 api:没有足够的权限访问 /me GET

检索 LinkedIn 访问令牌

使用现有凭据向 youtube 数据 api 发出请求

向 iOS 发出 AWS 产品广告 API 请求

使用 laravel 向 api 发出多个请求