我已经成功完成了LinkedIn OAuth流程(使用REST API - OAuth 1.0a)。但是我在回调后遇到了第一个API调用问题。我在我正在编写的库中设置UserToken,UserTokenSecret和UserVerfier,并调用此函数来获取我的个人资料信息:
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);
}
函数var_dumps一个字符串,这是我的个人资料的基本概要:
string(402) " User Name etc. etc. http://www.linkedin.com/profile?viewProfile=&key=28141694&authToken=HWBC&authType=name&trk=api*a137731*s146100* "
那很好。但是,在刷新页面的那一刻,相同的函数调用失败了:
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. "
需要注意的事项:
另外,我必须承认,我并非100%确定我理解这个功能正在发生的一切。我实际上从本教程(关于不同的服务,而不是linkedin)http://apiwiki.justin.tv/mediawiki/index.php/OAuth_PHP_Tutorial中获取了示例,并将其与我从LinkedIn API文档中收集的信息相结合,并在整个开发人员站点中传播。最值得注意的是添加了教程没有使用的“验证程序”。
对此问题的任何见解将不胜感激。提前致谢。 -Nick
我能够实现这一目标的唯一方法是每次都进行新的OAuth握手。这是应该发生的方式吗?我的印象是,一旦我获得了我的用户令牌/密码和验证程序,我就可以将这些用于连续的API调用,直到令牌过期或被撤销。
就像现在一样,每次页面重新加载时我都在请求新的用户令牌,密码和验证者,然后立即调用以获取用户配置文件(成功)。接下来重新加载,我得到一个全新的密钥/秘密和验证程序。对于每次调用来说似乎都有相当多的工作,而且据我所知,你应该能够使用这种方法执行离线操作 - 如果我每次都需要新的授权,那么我想我不能那样做?
答案 0 :(得分:1)
好。我终于弄清楚发生了什么,所以我想在这里发布答案,以防其他人碰到这个。
我作为指南使用的例子存在缺陷。检索访问令牌后,您应该创建一个新的OAuthRequest对象,而不是使用现有的$ 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());