4

curlを使用してGoogleアカウントに以下のpostメソッドを使用していますが、invalid_requestエラーが発生します。

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/ux5gNj-_mIu4DOD_gNZdjX9EtOFf&
client_id=1084945748469-eg34imk572gdhu83gj5p0an9fut6urp5.apps.googleusercontent.com&
client_secret=CENSORED&
redirect_uri=http://localhost/oauth2callback&
grant_type=authorization_code

これがcurlを使用した私のPHPコードです

$text ='test';

$URL = "https://accounts.google.com/o/oauth2/token";

$header = array(
"POST /o/oauth2/token HTTP/1.1",
"Host: accounts.google.com",
"Content-type: application/atom+xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache", 
"code=[my_code]&client_id=[my_client_id]&client_secret=[my_client_secret]& redirect_uri=http://localhost/curl_resp.php&grant_type=authorization_code",
"Content-length: ".strlen($text),
);


 $xml_do = curl_init();
 curl_setopt($xml_do, CURLOPT_URL, $URL);
 curl_setopt($xml_do, CURLOPT_CONNECTTIMEOUT, 10);
 curl_setopt($xml_do, CURLOPT_TIMEOUT, 10);
 curl_setopt($xml_do, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($xml_do, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($xml_do, CURLOPT_SSL_VERIFYHOST, false);
 curl_setopt($xml_do, CURLOPT_POST, false);
 curl_setopt($xml_do, CURLOPT_POSTFIELDS, $text);
 curl_setopt($xml_do, CURLOPT_HTTPHEADER, $header);

そして、無効なリクエストエラーが発生しています

4

5 に答える 5

8

GoogleのoAuthAPIの使用については何も知りませんが、これまで見てきた例から、直接ではなく、投稿フィールドに値(つまりcode、など)を渡すことになっているようです。 client_idHTTPヘッダー。

次の例はまだ完全には機能しませんが、invalid_requestエラーが発生する代わりに、が表示されますinvalid_grant。私が述べたことに加えて何か他の問題があると思います(おそらくGoogleなどからの新しいクレデンシャルが必要です)が、これは少なくとも一歩近づくかもしれません:

$post = array(
    "grant_type" => "authorization_code", 
    "code" => "your_code", 
    "client_id" => "your_client_id", 
    "client_secret" => "your_client_secret", 
    "redirect_uri" => "http://localhost/curl_resp.php"
);

$postText = http_build_query($post);

$url = "https://accounts.google.com/o/oauth2/token";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postText); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$result = curl_exec($ch);
var_dump($result);    // gets an error, "invalid_grant"
于 2012-06-07T15:26:34.130 に答える
1

リクエストへの応答には、実際には問題の非常に読みやすい説明が含まれています。

POSTリクエストにはContent-lengthヘッダーが必要です。

于 2012-06-07T13:14:35.213 に答える
0

CURLOPT_POSTをfalseに設定しているのはなぜですか?

 curl_setopt($xml_do, CURLOPT_POST, false);

CURLOPT_POSTFIELDSが設定されている場合、cURLの一部の構成では、これが自動的にtruに変更されますが、有効なポストフィールドがありません。

HTTP「POST」操作で投稿する完全なデータ。ファイルを投稿するには、ファイル名の前に@を付け、フルパスを使用します。ファイル名の後に「;type= mimetype」の形式のタイプを付けることにより、ファイルタイプを明示的に指定できます。このパラメーターは、「para1 = val1&para2 = val2&...」のようなurlencoded文字列として、またはフィールド名をキーとして、フィールドデータを値として持つ配列として渡すことができます。値が配列の場合、Content-Typeヘッダーはmultipart/form-dataに設定されます。PHP 5.2.0以降、ファイルが@プレフィックスを付けてこのオプションに渡される場合、値は配列である必要があります。

param=value構文または渡された配列のいずれかである必要があります。

于 2012-06-07T14:50:52.513 に答える
0

私はCURLメソッドと有効なGoogleコードでpostarrayを使用しましたが、それは私のために働きました

于 2012-06-08T07:21:13.790 に答える
0

私も同じ問題を抱えていました。そこでは、グーグルが「invalid_xxx」を返します。

多くの調査とトラブルシューティングを行った後、問題はフォーム自体のエンコーディングにあります。関数「http_builder_query」は文字列を台無しにし、グーグルはそれを「認識」できないため、使用しないでください。例 :

http_builder_query出力:"code = 4%252FYYUT71KJ6..."

に比べ

通常の文字列:"code = 4 / YYUT71KJ6 ..."

これが私の作業コードです。ここでは、独自のデータが必要な場所に「x」を配置しています(google oauth認証から取得および変更)

    $code_from_user_login = "4/YYUT71KJ6....";
    $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token");
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);


        $post_params = "code=" . $code_from_user_login . "&";
        $post_params .= "redirect_uri=http://www.x.com/&";
        $post_params .= "client_id=x.apps.googleusercontent.com&";
        $post_params .= "client_secret=x&";
        $post_params .= "grant_type=authorization_code&";


        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
        $result = curl_exec($ch);
        print($result);

結果は次のようになります:

  '{
  "access_token" : "ya29.AHES6ZSwJSHpTZ1t....",
  "token_type" : "Bearer",
  "expires_in" : 3599,
  "id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjU0MDQxOTZlMmQzOGNjYTA2MW...."
}'

'access_token'を取得したら、次のURLでプロファイルデータにアクセスします: https ://www.googleapis.com/oauth2/v1/userinfo?access_token = YOUR_ACCESS_TOKEN_HERE

〜終わり〜

于 2013-08-22T17:17:40.220 に答える