【发布时间】:2011-07-14 14:13:37
【问题描述】:
我已成功完成 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. "
注意事项:
- 在初始授权回调期间(就在调用此函数之前),用户令牌、秘密和验证者将被保留。因此,它们在第一次调用期间(当它工作时,从linkedin 返回之后)和在页面重新加载期间(当它在第 234 行失败时)是相同的。
另外,我必须承认我不是 100% 确定我理解这个函数中发生的所有事情。实际上,我从本教程(关于不同的服务,而不是linkedin)http://apiwiki.justin.tv/mediawiki/index.php/OAuth_PHP_Tutorial 中获取了示例,并将其与我从 LinkedIn API 文档中收集的信息相结合,这些信息分布在他们的开发人员网站上。最值得注意的是添加了本教程未使用的“验证器”。
任何对此问题的见解将不胜感激。提前致谢。 -尼克
更新
我能够做到这一点的唯一方法是每次都进行一次新的 OAuth 握手。这是它应该发生的方式吗?我的印象是,一旦我获得了我的用户令牌/秘密和验证程序,我就可以将它们用于连续的 API 调用,直到令牌过期或被撤销。
就像现在一样,每次重新加载页面时,我都会请求新的用户令牌、秘密和验证器,然后立即调用以获取用户配置文件(成功)。下一次重新加载,我得到一个全新的密钥/秘密和验证器。每次通话似乎都需要做很多工作,据我了解,您应该可以使用此方法执行离线操作-如果我每次都需要新的授权,那我想我不能这样做吗?
【问题讨论】:
-
从 LinkedIn 传回用户令牌和密码后,您如何存储它们?在将它们发回时,页面有它们并且可以进行调用,但是在重新加载页面时,除非您将它们存储在会话或数据库中,否则看起来您在没有有效令牌的情况下调用 API。
-
嗨,Paul,在调用此函数之前,我将令牌、秘密和验证器存储在用户会话中。所以在页面重新加载时,它们应该仍然存在。当您在代码 sn-p 中看到 $this->getUserToken/Secret/Verifier() 时,它正在从 auth 调用中检索现有信息。
-
我不明白的一件事是,为什么在我粘贴的 sn-p 中,我得到了一个新的 auth_token 和 secret,并将它们用于下一次调用。为什么不直接使用我已有的?这就是我不完全理解发生了什么的意思——从我在网上找到的一个例子中改变了这一点。