ユーザーが承認を取り消すまで、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とシークレットと同様、オフラインの方法を設定します)。そして、認可を取得し働いている。私は、カレンダーに得ることができます。それだけで長続きしません...
ありがとう...しかし、アクセストークンと更新トークンの両方がすぐに必要なのはなぜですか? APIには、getAccessTokenとgetRefreshTokenという2つのメソッドがあります。しかし、setAccessTokenを設定するのは1人だけです。ユーザーからAuthコードを取得するときに、getAuth() - > authenticateを実行できますが、返すものがAccessまたはRefreshトークンであるかどうかはAPIが通知しません。 getAuth-> authenticateの結果をsetAccessTokenに渡す必要がありますか?それでは、getAccessTokenとは何ですか? – unfulvio
また、Google PHP APIから、アクセストークンはjsonオブジェクトであるようですが、リフレッシュトークンは文字列ですか?では、リフレッシュトークンをgetAuth-> authenticate()メソッドに渡す必要がありますか? – unfulvio
ここでいくつかの回答が見つかりました:https://developers.google.com/identity/protocols/OAuth2WebServer?hl=en – unfulvio