2012-01-17 22 views
2

I found this functionおそらくaccessTokenを取得しますが、何も取得しません。 私は$_REQUEST['code']とこの機能に必要なその他の情報を持っています。PHP。アクセストークンを取得する方法。 Google APIのOAuth 2.0による認証

ここで何が間違っていますか?おかげさまで

//Oauth 2.0: exchange token for session token so multiple calls can be made to api 
if(isset($_REQUEST['code'])){ 
    $_SESSION['accessToken'] = get_oauth2_token($_REQUEST['code']); 
} 

//returns session token for calls to API using oauth 2.0 
function get_oauth2_token($code) { 
    global $client_id; 
    global $client_secret; 
    global $redirect_uri; 

    $oauth2token_url = "https://accounts.google.com/o/oauth2/token"; 
    $clienttoken_post = array(
    "code" => $code, 
    "client_id" => $client_id, 
    "client_secret" => $client_secret, 
    "redirect_uri" => $redirect_uri, 
    "grant_type" => "authorization_code" 
    ); 

    $curl = curl_init($oauth2token_url); 

    curl_setopt($curl, CURLOPT_POST, true); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post); 
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

    $json_response = curl_exec($curl); 
    curl_close($curl); 

    $authObj = json_decode($json_response); 

    if (isset($authObj->refresh_token)){ 
     //refresh token only granted on first authorization for offline access 
     //save to db for future use (db saving not included in example) 
     global $refreshToken; 
     $refreshToken = $authObj->refresh_token; 
    } 

    $accessToken = $authObj->access_token; 
    return $accessToken; 
} 

答えて

1

あなたのコードに間違いはありませんが、クライアントシークレットをリフレッシュして、役立つかどうか確認してください。さらに、あなたのカールコマンドから応答が返ってきていることを正確に確認することをお勧めします。私はそれが "invalid_grant"だと思っています。

これを行うにはもっと良い方法は、GoogleのPHP APIクライアントを使用することです:あなたのためのコミュニケーションのほとんどを扱う

https://code.google.com/p/google-api-php-client/

。非常に使いやすい例があります。それは主にあなたがアクセスしようとしているGoogleサービスに依存します。

1

このコードはおなじみです - 私はおおよそ同じコードを使用しています - あなたが試すことができる2つのことがあります。

  1. 使用すると、ブラウザ

    エコー$のjson_responseへの応答をエコーするエコー。

  2. はフィドラーのホールドを取得し、

    ますcurl_setopt($カール、CURLOPT_PROXY、 '127.0.0.1:8888')をcurl_execの呼び出しの前に次の行を使用します。

は、「私はそれがいずれかの作業を持っていませんでしたfraid - 誰が、何がこれで間違っている方法を知っているならば、私は取得しています応答が

{ 
    "error" : "invalid_request" 
} 

である;)

0

をセクション4.4から「OAuth 2.0の認証プロトコルドラフト-IETF-OAuthの-v2-20」の0.2

クライアントがを追加することにより、トークンエンドポイントに要求を行いますそこでPOSTさパラメータが文字列ではなく、アレイの形で提出されなければならない

:HTTPリクエストエンティティボディ内の「アプリケーション/ x-www-form-urlencodedで」 形式を使用して次のパラメータ。これはcurl_setoptのPHPマニュアルにも言及されています。

$ clienttoken_postを投稿する代わりに、http_build_query($ clienttoken_post、 ''、 '&')を投稿するとよいでしょう。

これはすべての問題を解決するわけではありませんが、おそらく正しい方向へのステップです。

0

私は同じエラーを持っていた、と私は

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 

を追加すると、要求はすぐにそれを解決し、リダイレクトを追跡できるようにすることがわかりました。私は他人を助けることを願っています!

4

これは私がアクセストークンとリフレッシュトークンを取得するために行ったことです。

次のコードを含むファイルを作成します。今

<?php 

if (isset($_GET['code'])) { 
    // try to get an access token 
    $code = $_GET['code']; 
    $url = 'https://accounts.google.com/o/oauth2/token'; 
    $params = array(
     "code" => $code, 
     "client_id" => YOUR_CLIENT_ID, 
     "client_secret" => YOUR_CLIENT_SECRET, 
     "redirect_uri" => 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"], 
     "grant_type" => "authorization_code" 
    ); 

    $ch = curl_init(); 
    curl_setopt($ch, constant("CURLOPT_" . 'URL'), $url); 
    curl_setopt($ch, constant("CURLOPT_" . 'POST'), true); 
    curl_setopt($ch, constant("CURLOPT_" . 'POSTFIELDS'), $params); 
    $output = curl_exec($ch); 
    $info = curl_getinfo($ch); 
    curl_close($ch); 
    if ($info['http_code'] === 200) { 
     header('Content-Type: ' . $info['content_type']); 
     return $output; 
    } else { 
     return 'An error happened'; 
    } 
} else { 

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

    $params = array(
     "response_type" => "code", 
     "client_id" => YOUR_CLIENT_ID, 
     "redirect_uri" => 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"], 
     "scope" => "https://www.googleapis.com/auth/plus.me" 
    ); 

    $request_to = $url . '?' . http_build_query($params); 

    header("Location: " . $request_to); 
} 

を、クライアントIDとクライアントシークレットとYOUR_CLIENT_IDYOUR_CLIENT_SECRETを交換してください。

範囲が正しいことを確認してください。たとえば、Analyticsにアクセスするには、https://www.googleapis.com/auth/analyticsにする必要があります。

ファイルを実行すると、OAuth2承認画面が表示されます。

{ 
    "access_token" : YOUR_ACCESS_TOKEN, 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : YOUR_REFRESH_TOKEN 
} 

結果はあなたが適用しているどの範囲に応じて、追加のフィールドが含まれる場合があります。

あなたが今Acceptを押すと

は、あなたはこのように見える結果を取得する必要があります。

+1

Thanx alot bro ....あなたのコードは私にとって完璧に働いています – deemi

+0

ファイルをどのように実行しましたか?私はそれをfilezilla上のphpファイルに入れ、ブラウザで実行しました。しかし、それは私のために働いていない – Simone

+0

@記号:何か間違いをしていますか? –

関連する問題