2-сторонний Oauth API Google: «Недопустимый токен — недопустимый токен AuthSub».

#php #oauth #2-legged

#php #oauth #2-сторонний

Вопрос:

Я основал свой код на http://gdatatips.blogspot.com/2008/11/2-legged-oauth-in-php.html .

Вот мой код, я хочу работать с API Google Doc (список документов) :

         $endpoint = 'https://www.google.com/accounts/OAuthGetRequestToken';
        $consumer = new OAuthConsumer(GOOGLE_API_DOCLIST_CONSUMER_KEY, GOOGLE_API_DOCLIST_CONSUMER_SECRET, NULL);

        $arrParams = array(
                    'scope' => 'https://docs.google.com/feeds/'
                    ,'xoauth_requestor_id' => GOOGLE_API_DOCLIST_USER_EMAIL
                    );
        $req = OAuthRequest::from_consumer_and_token($consumer, NULL, "GET", $endpoint, $arrParams);
        $req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, null);


        $curl = new Auth_Curl();
        $content = $curl->request($req->to_url());


        $docAPI = new GoogleAPI_DocumentList(new Auth_Curl(), $req->to_header());

        var_dump($req->to_header());
        echo '<br />-- Getting Collections list';

        $url = 'https://docs.google.com/feeds/default/private/full/-/folder' . '?xoauth_requestor_id=' . GOOGLE_API_DOCLIST_USER_EMAIL;
        $raw = $docAPI->getCollectionList($url);
        var_dump($raw);
        die();
  

Я постоянно получаю:

Недопустимый токен — недопустимый токен AuthSub.

Что я делаю не так?

Редактировать: вот несколько «подсказок»:

  • Похоже, они смешивают конечную точку API и базовый канал. Я ввел OAuthGetRequestToken для конечной точки. Похоже, он генерирует действительный ответ.
  • Я сохранил его, но я не уверен, что требуется xoauth_requestor_id .
  • В документации говорится, что для разделения параметров в заголовке авторизации следует использовать пробел. библиотека использует запятую.

Ответ №1:

Вот исправленный код:

     $endpoint = 'https://docs.google.com/feeds/default/private/full/-/folder';
    $consumer = new OAuthConsumer(GOOGLE_API_DOCLIST_CONSUMER_KEY, GOOGLE_API_DOCLIST_CONSUMER_SECRET, NULL);

    $arrParams = array(
                'xoauth_requestor_id' => GOOGLE_API_DOCLIST_USER_EMAIL
                );
    $req = OAuthRequest::from_consumer_and_token($consumer, NULL, "GET", $endpoint, $arrParams);
    $req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, null);

    $docAPI = new GoogleAPI_DocumentList(new Auth_Curl(), $req->to_header());

    var_dump($req->to_header());
    echo '<br />-- Getting Collections list';

    $url = 'https://docs.google.com/feeds/default/private/full/-/folder' . '?xoauth_requestor_id=' . GOOGLE_API_DOCLIST_USER_EMAIL;
    $raw = $docAPI->getCollectionList($url);
    var_dump($raw);
    die();
  
  • API и конечная точка не были смешаны. В OAuth версии v1.0 вы не просите сервер сгенерировать токен для использования в заголовке авторизации, заголовок авторизации генерируется на 100% локально. (Я думаю, что URL-адрес используется в какой-то момент для отображения заголовка авторизации)
  • Поскольку вы не создаете access_token, вам не нужно определять область.
  • Убедитесь, что у вас есть бизнес-аккаунт
    • Только бизнес-учетная запись позволяет активировать 2-стороннюю аутентификацию.