Я успешно прошел процесс OAuth в LinkedIn (используя 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 и соединил его с информацией, которую я собрал из документации API LinkedIn, распространенной по всему их сайту для разработчиков. Наиболее заметным было добавление «верификатора», который учебник не использовал.
Любое понимание этой проблемы будет с благодарностью. Заранее спасибо.
-Nick
UPDATE
Единственный способ, которым я смог добиться этого, - каждый раз совершать новое рукопожатие OAuth. Это так, как это должно произойти? У меня сложилось впечатление, что, как только я получу свой токен / секретный ключ и верификатор пользователя, я смогу использовать их для непрерывных вызовов API до истечения срока действия токена или его отзыва.
Как и сейчас, каждый раз, когда страница перезагружается, я запрашиваю новый пользовательский токен, секрет и верификатор, а затем немедленно звоню, чтобы получить профиль пользователя (что успешно). Следующая перезагрузка, я получаю совершенно новый ключ / секрет и верификатор. Похоже, что для каждого вызова достаточно много работы, и, как я понял, вы должны иметь возможность выполнять автономные операции с помощью этого метода - и если мне потребуется новая авторизация каждый раз, то я полагаю, что не могу этого сделать?