1

多くの人が同様のエラーを抱えています...私の質問には誰も答えません。ユーザーに Google Plus にログインして更新トークンを保存してもらい、ユーザーに代わって Moments に投稿できるようにしようとしています。トークンの認証を通過することさえできません。これが私のコードです:

require $_SERVER['DOCUMENT_ROOT'] . '/members/assets/lib/google/Google_Client.php';
require $_SERVER['DOCUMENT_ROOT'] . '/members/assets/lib/google/contrib/Google_PlusService.php';

$client = new Google_Client();
    $client->setApplicationName("Americal Lose Weight");
    $client->setClientId($oauth2_client_id);
    $client->setClientSecret($oauth_client_secret);
    $client->setRedirectUri($oauth2_redirect_uri);

    $plus = new Google_PlusService($client);

if (isset($_REQUEST['logout'])) {
  unset($_SESSION['access_token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}

if (isset($_SESSION['access_token'])) {
  $client->setAccessToken($_SESSION['access_token']);
}

if ($client->getAccessToken()) {
  $me = $plus->people->get('me');

  $url = filter_var($me['url'], FILTER_VALIDATE_URL);
  $img = filter_var($me['image']['url'], FILTER_VALIDATE_URL);
  $name = filter_var($me['displayName'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
  $personMarkup = "<a rel='me' href='$url'>$name</a><div><img src='$img'></div>";

  $optParams = array('maxResults' => 100);
  $activities = $plus->activities->listActivities('me', 'public', $optParams);
  $activityMarkup = '';
  foreach($activities['items'] as $activity) {
    $url = filter_var($activity['url'], FILTER_VALIDATE_URL);
    $title = filter_var($activity['title'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
    $content = filter_var($activity['object']['content'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
    $activityMarkup .= "<div class='activity'><a href='$url'>$title</a><div>$content</div></div>";
  }

  // The access token may have been updated lazily.
  $_SESSION['access_token'] = $client->getAccessToken();
} else {
  $authUrl = $client->createAuthUrl();
}

if(isset($authUrl)) {
    header("Location: $authUrl");
} else {
    var_dump($_SESSION);    
}

もちろん、クライアント ID とクライアント シークレットは構成ファイルに保存されており、このファイルが呼び出される前に呼び出されます。

認証URLが読み込まれ、Google Plusアカウントを選択できます...しかし、コールバックでそれが表示されます

例外「Google_AuthException」がキャッチされず、「OAuth2 アクセス トークンの取得中にエラーが発生しました。メッセージ:「invalid_request」」

http://members.americaloseweight.com/auth/login.php?app=googleで試すことができます。 私のリダイレクト URL はこのページを指しています。

それで、私は何を間違っていますか?

編集

Google_OAuth2.php の 97 行目で、makeRequest 関数を呼び出します。

$request = Google_Client::$io->makeRequest(new Google_HttpRequest(self::OAUTH2_TOKEN_URI, 'POST', array(), array(
      'code' => $code,
      'grant_type' => 'authorization_code',
      'redirect_uri' => $this->redirectUri,
      'client_id' => $this->clientId,
      'client_secret' => $this->clientSecret
  )));

リクエストとして返されたものをダンプすると、次のようになります。

Google_HttpRequest Object
(
    [batchHeaders:Google_HttpRequest:private] => Array
        (
            [Content-Type] => application/http
            [Content-Transfer-Encoding] => binary
            [MIME-Version] => 1.0
            [Content-Length] => 
        )

    [url:protected] => https://accounts.google.com/o/oauth2/token
    [requestMethod:protected] => POST
    [requestHeaders:protected] => Array
        (
            [content-type] => application/x-www-form-urlencoded
            [content-length] => 272
        )

    [postBody:protected] => code=4%2FPWcMMWU80cd20kvppA0mlA8ldCYl.grjspKy0hxAUshQV0ieZDAq-J97AgwI&grant_type=authorization_code&redirect_uri=http%3A%2F%2Fmembers.americaloseweight.com%2Fauth%2Flogin.php%3Fapp%3Dgoogle&client_id=344482743517-2pn1hngv5sv3mf4bk70pjvq2ufkf2uii.apps.googleusercontent.com
    [userAgent:protected] => Americal Lose Weight google-api-php-client/0.6.5
    [responseHttpCode:protected] => 400
    [responseHeaders:protected] => Array
        (
            [cache-control] => no-cache, no-store, max-age=0, must-revalidate
            [pragma] => no-cache
            [expires] => Fri, 01 Jan 1990 00:00:00 GMT
            [date] => Tue, 22 Oct 2013 13:49:18 GMT
            [content-type] => application/json
            [x-content-type-options] => nosniff
            [x-frame-options] => SAMEORIGIN
            [x-xss-protection] => 1; mode=block
            [server] => GSE
            [alternate-protocol] => 443:quic
            [transfer-encoding] => chunked
        )

    [responseBody:protected] => {
  "error" : "invalid_request"
}
    [accessKey] => 
)
4

1 に答える 1

2

クライアント シークレットが正しいことを確認してください。文字列の末尾などに余分なスペースがないことを確認してください。また、クライアント ID が正しいタイプであることも確認してください。これは Web アプリケーションのクライアント ID です。

于 2013-10-22T08:37:13.510 に答える