繁体   English   中英

在 OAuth 身份验证后,LinkedIn API 调用出现问题

[英]Issue with LinkedIn API call after OAuth authentication

我已经成功通过了 LinkedIn OAuth 流程(使用 REST API - Z54699D1.581E6DF4EDBCA40) 但是,我在回调后的第一个 API 调用时遇到了问题。 我在我正在编写的库中设置了 UserToken、UserTokenSecret 和 UserVerfier,这调用了这个 function 来获取我的个人资料信息:

public function getUserProfile()
{
    $consumer = new OAuthConsumer($this->consumer_key, $this->consumer_secret, NULL);
    $auth_token = new OAuthConsumer($this->getUserToken(), $this->getUserTokenSecret());
    $access_token_req = new OAuthRequest("GET", $this->access_token_endpoint);
    $params['oauth_verifier'] = $this->getUserVerifier();
    $access_token_req = $access_token_req->from_consumer_and_token($this->consumer,
            $auth_token, "GET", $this->access_token_endpoint, $params);

    $access_token_req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(),$consumer,
            $auth_token);

    $after_access_request = $this->doHttpRequest($access_token_req->to_url());
    $access_tokens = array();
    parse_str($after_access_request,$access_tokens);

    # line 234 below
    $access_token = new OAuthConsumer($access_tokens['oauth_token'], $access_tokens['oauth_token_secret']);


    // prepare for get profile call
    $profile_req = $access_token_req->from_consumer_and_token($consumer,
            $access_token, "GET", $this->api_url.'/v1/people/~');

    $profile_req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(),$consumer,$access_token);

    $after_request = $this->doHttpRequest($profile_req->to_url());


    var_dump($after_request);
}

function var_dumps 一个字符串,这是我个人资料的基本概要:

string(402) " User Name etc. etc. http://www.linkedin.com/profile?viewProfile=&key=28141694&authToken=HWBC&authType=name&trk=api*a137731*s146100* "

那挺好的。 但是,在我刷新页面的那一刻,相同的 function 调用失败并显示:

Undefined index: oauth_token, line number: 234 

(此行在上面的代码块中用注释标记)。

然后,当然,var_dump 会从 LinkedIn 报告此错误:

string(290) " 401 1310652477038 R8MHA2787T 0 [unauthorized]. The token used in the OAuth request is not valid. "

需要注意的一点:

  • 在初始授权回调期间(就在调用此 function 之前),用户令牌、秘密和验证者将被保留。 因此,它们在第一次调用期间(当它工作时,在从linkedin 返回之后)和在页面重新加载期间(当它在第 234 行失败时)是相同的。

另外,我必须承认,我不能 100% 确定我了解 function 中发生的一切。 实际上,我从本教程中提取了示例(关于不同的服务,而不是链接) http://apiwiki.justin.tv/mediawiki/index.php/OAuth_PHP_Tutorial并将其与我从 LinkedIn API 文档中收集的信息相结合开发者网站。 最值得注意的是添加了本教程未使用的“验证器”。

对此问题的任何见解将不胜感激。 提前致谢。 -缺口

更新

我能够做到这一点的唯一方法是每次都进行一次新的 OAuth 握手。 这是它应该发生的方式吗? 我的印象是,一旦我获得了用户令牌/秘密和验证程序,我就可以将它们用于连续的 API 调用,直到令牌过期或被撤销。

就像现在一样,每次页面重新加载时,我都会请求一个新的用户令牌、秘密和验证者,然后立即调用以获取用户配置文件(成功)。 下一次重新加载,我得到一个全新的密钥/秘密和验证器。 每次通话似乎都需要做很多工作,据我了解,您应该可以使用此方法执行离线操作-如果我每次都需要新的授权,那么我想我不能这样做吗?

出色地。 我终于弄清楚发生了什么,所以我想我会在这里发布答案,以防万一其他人遇到这个问题。

我用作指南的示例存在缺陷。 检索到访问令牌后,您应该创建一个新的 OAuthRequest object,而不是使用现有的 $access_token_req 实例。

所以这:

// prepare for get profile call
$profile_req = $access_token_req->from_consumer_and_token($consumer,
        $access_token, "GET", $this->api_url.'/v1/people/~');

$profile_req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(),$consumer,$access_token);

$after_request = $this->doHttpRequest($profile_req->to_url());

应该改成这样:

$api_req = new OAuthRequest("GET", $this->api_url.$api_call);

// prepare for get profile call
$api_req = $api_req->from_consumer_and_token($consumer,
        $access_token, "GET", $this->api_url.'/v1/people/~');

$api_req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(),$consumer,$access_token);

$after_request = $this->doHttpRequest($api_req->to_url());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM