Проблема с вызовом API LinkedIn после проверки подлинности OAuth - PullRequest
0 голосов
/ 14 июля 2011

Я успешно прошел процесс 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 до истечения срока действия токена или его отзыва.

Как и сейчас, каждый раз, когда страница перезагружается, я запрашиваю новый пользовательский токен, секрет и верификатор, а затем немедленно звоню, чтобы получить профиль пользователя (что успешно). Следующая перезагрузка, я получаю совершенно новый ключ / секрет и верификатор. Похоже, что для каждого вызова достаточно много работы, и, как я понял, вы должны иметь возможность выполнять автономные операции с помощью этого метода - и если мне потребуется новая авторизация каждый раз, то я полагаю, что не могу этого сделать?

1 Ответ

1 голос
/ 17 июля 2011

Хорошо. Я наконец-то понял, что происходит, и подумал, что опубликую ответ здесь, на случай, если кто-то еще столкнется с этим.

Пример, который я использовал в качестве руководства, был ошибочным. После получения токена доступа вы должны создать новый объект 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());
...