2015-09-21 8 views
13

ユーザーが承認を取り消すまで、Googleクライアントを永久に承認するにはどうすればよいですか?Google API PHPオフラインアクセス「無効な許可:コードは既に使用されています」

Googleカレンダーに接続するアプリを作成しようとしています。それはPHPで実行する必要がありますので、Googleが提供するGoogle API PHPクライアントを使用しています。

ユーザーがセッションに参加していないときに機能するように、アプリケーションにオフラインアクセスが必要です。このアプリは、ユーザーが自分のカレンダーをウェブサイトなどに公に管理して表示することを目的としています。

サービスメソッド(クライアントIDとクライアントシークレットを使用)を使用してGoogleコンソールに証明書を作成しました。 Google APIクライアントを使用して、ユーザーからの承認もリクエストしました。私は新しいブラウザウィンドウを開き、ユーザーが承認し、Googleによって認証コードが返されます。私はこのコードを保存し、それを使用してクライアントを認証し、Googleカレンダーに接続してデータを交換します。

今、私はこれが期限切れになるトークンであると理解しました。私が設定したオフラインアクセスを使用しない限り。しかし、私は常にエラーになります、数分後に以下:Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.

これは私がクライアントを接続するために使用するコードです:

$client = new \Google_Client(); 
$client->setApplicationName('My App'); 
$client->setScopes(array(\Google_Service_Calendar::CALENDAR)); 
$client->setClientId($this->google_client_id); 
$client->setClientSecret($this->google_client_secret); 
$client->setRedirectUri($this->google_client_redirect); 
$client->setAccessType('offline'); 

if ($code = $this->google_client_auth) { 

    try { 

     $client->authenticate($code); 

    } catch(\Exception $e) { 
      var_dump($e); 
    }  

} 

return new \Google_Service_Calendar($client); 

これは、クラス内のメソッドです。

クライアントIDとクライアントシークレットは、アプリの設定に保存されています。

私はこの設定でユーザーから返されたコードも保存していますが、これは私が間違っていると思いますか?別の方法でGoogle OAuthウィンドウへのリンクを張っています同じクライアントIDとシークレットと同様、オフラインの方法を設定します)。そして、認可を取得し働いている。私は、カレンダーに得ることができます。それだけで長続きしません...

答えて

24

コードの3種類がありますかトークングーグルAuthentcationサーバ戻る。

  1. 認証コード
  2. 012アクセストークン
  3. 更新トークン。

認証コード

ユーザーがAuthentcationフォームをクリックし、アプリケーションへのアクセスを許可します。 Googleから認証コードを返します。このコードを使用して、Accessトークンとリフレッシュトークンを交換する必要があります。あなたがしようとするとエラーメッセージが表示されます、再びそれを使用する場合、このコードは一度だけ使用されます。

invalid_grant: Code was already redeemed.

アクセストークン

アクセストークンは、このトークンは、すべてあなたが作る要求とともに送信されるべきAPIにアクセスするために使用されています。アクセストークンは短いです、彼らは時間のために働くし、その後、彼らが働いて

のリフレッシュトークン

のリフレッシュトークンは、サーバー上のいくつかの場所に保存する必要があります停止住んでいました。アクセストークンが期限切れになったら、リフレッシュトークンを使用して新しいアクセストークンを取得できます。

あなたの問題は、あなたには役に立たない認証コードを保存していることです。リフレッシュトークンを見つけて保存する必要があります。

+0

ありがとう...しかし、アクセストークンと更新トークンの両方がすぐに必要なのはなぜですか? APIには、getAccessTokenとgetRefreshTokenという2つのメソッドがあります。しかし、setAccessTokenを設定するのは1人だけです。ユーザーからAuthコードを取得するときに、getAuth() - > authenticateを実行できますが、返すものがAccessまたはRefreshトークンであるかどうかはAPIが通知しません。 getAuth-> authenticateの結果をsetAccessTokenに渡す必要がありますか?それでは、getAccessTokenとは何ですか? – unfulvio

+1

また、Google PHP APIから、アクセストークンはjsonオブジェクトであるようですが、リフレッシュトークンは文字列ですか?では、リフレッシュトークンをgetAuth-> authenticate()メソッドに渡す必要がありますか? – unfulvio

+1

ここでいくつかの回答が見つかりました:https://developers.google.com/identity/protocols/OAuth2WebServer?hl=en – unfulvio

関連する問題