0

認証トークンを取得するために次のコードを書いています。

コード変数への承認の割り当て

$code =  $this->request->query['code'];

質問を投稿するためにクライアント シークレットを削除しました。

$clientSecret = "";

カールの初期化

        $ch = curl_init();
        $header[]         = "Content-Type: application/x-www-form-urlencoded";

        curl_setopt($ch, CURLOPT_HTTPHEADER,     $header);
        curl_setopt($ch, CURLOPT_POST,        true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode("code=".$code."&
                client_id=289710071999.apps.googleusercontent.com&
                client_secret=".$clientSecret."&
                redirect_uri=http://budzzflorist.localhost.com/users/google&
                grant_type=authorization_code"));
        curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $request_result = curl_exec($ch);
        print_r(curl_getinfo($ch));
        echo "\n\ncURL error number:" .curl_errno($ch); // print error info
        echo "\n\ncURL error:" . curl_error($ch);
        var_dump( json_decode($request_result,true));
4

2 に答える 2

0

あなたの呼び出しurlencodeは間違っています。事実上、これは基本的にpostパラメータ文字列全体をエンコードします。値(キーではなく)のみをURLエンコードする必要があります。

さらに、cURLはすべてを自動的にURLエンコードするため、自分の代わりに次の行を使用することを検討する必要があります。

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
  'code' => $code,
  'client_id' => $clientId,
  'client_secret' => $clientSecret,
  'redirect_uri' => 'http://example.org',
  'grant_type' => 'authorization_code'
));

更新:これが私のために働いたものです:

トークンのリクエスト

curl_setopt_array($ch, array(
  CURLOPT_POST => false,
  CURLOPT_POSTFIELDS => array(
    'response_type' => 'code',
    'client_id' => $clientId,
    'redirect_uri' => 'http://example.org/auth/google/callback',
    'scope' => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'
  ),
  CURLOPT_URL => 'https://accounts.google.com/o/oauth2/auth',
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_RETURNTRANSFER => true
));

$request_result = curl_exec($ch);

折り返し電話

curl_setopt_array($ch, array(
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => array(
    'code' => $code,
    'client_id' => $clientId,
    'client_secret' => $clientSecret,
    'redirect_uri' => 'http://example.org',
    'grant_type' => 'authorization_code'
  ),
  CURLOPT_URL => 'https://accounts.google.com/o/oauth2/token',
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_RETURNTRANSFER => true
));

$request_result = curl_exec($ch);
于 2012-07-27T17:39:14.870 に答える
0

Google がフォームを にしたいようapplication/x-www-urlencodedです。

これを試して:

$ch           = curl_init();
$code         = '123';
$clientSecret = '45686';

$postFields = array('code'          => $code,
                    'client_id'     => '289710071999.apps.googleusercontent.com',
                    'client_secret' => $clientSecret,
                    'redirect_uri'  => 'http://budzzflorist.localhost.com/users/google',
                    'grant_type'    => 'authorization_code');

curl_setopt($ch, CURLOPT_POST,        true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));
curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$request_result = curl_exec($ch);

var_dump( json_decode($request_result,true));

結果:invalid_clientトークンが正しくないため、invalid_request.

に配列を渡すと、cURL は無効なリクエストの原因とCURLOPT_POSTFIELDSなるコンテンツ タイプを強制します。multipart/form-data代わりhttp_build_queryに、キーと値のペアに基づいて配列から URL エンコードされたクエリ文字列を作成する which を使用します。次に、その結​​果を に渡しCURLOPT_POSTFIELDSます。

于 2012-07-27T18:07:51.663 に答える