5

Google APIの使用方法に関するドキュメント、例、チュートリアルを読みました。最新のアクティビティと情報を表示するミニアプリを既に実行していますが、トークンを保存するためにセッションを使用しています。

私の質問は、データベースからトークンを保存および取得して、ユーザー(既に登録済み)が[ログイン]をクリックしたときに、認証を繰り返さなくてもすぐにAPIを使用できるようにするにはどうすればよいですか?ミニアプリの開始点としてこの例を使用したことに注意してください。

コードスニペットは次のとおりです。

$client = new apiClient();
$client->setApplicationName(APP_NAME);
$client->setClientId(CLIENT_ID);
$client->setClientSecret(CLIENT_SECRET);
$client->setRedirectUri(REDIRECT_URL);
$client->setDeveloperKey(DEV_KEY);

$plus = new apiPlusService($client);
$google_userinfo = new apiOauth2Service($client);

$message = "";

// In a real application this would be stored in a database, and not in the session!
if (isset($_SESSION['token']))
  $client->setAccessToken($_SESSION['token']);

$_SESSION['token'] = $client->getAccessToken();

if (isset($_GET['code'])) {
   $client->authenticate();
  // In a real application this would be stored in a database, and not in the session!
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}
...
 //Somewhere here, I added a function that ties $_SESSION['token'] to the user's info.
...
<form action="" method="post" id="form1" name="form1">
   <fieldset>
      <div id="main-url-section" style="width: 50%;margin: 0px auto;text-align: center;">
         <?php
            $authUrl = $client->createAuthUrl();
            print "<p><a class='login' href='$authUrl'>Log me in!</a></p>";
         ?>                                 
      </div>
    </fieldset>
</form>

助けてくれてありがとう!

よろしく、

ジョン

4

2 に答える 2

9

アプリケーションをすでに承認しているユーザーの承認プロンプトをGoogleにスキップさせたい場合は、上部の構成ブロックに次のコードを追加します。

$client->setAccessType("online");
$client-> setApprovalPrompt("auto");

このソリューションには1つの落とし穴があります。それは、OAuthダンスを完了したときに更新トークンを受け取らないことです。これは、新しいトークンを取得するために、アクセストークンの有効期限が切れるたびに、ユーザーがGoogleの認証サービスにリダイレクトされることを意味します。これはほぼ1時間ごとに発生します。

背景情報

デフォルトでは、PHPクライアントライブラリはオフラインアクセスを提供するように構成されています。これはソースコードで確認できます。このモードを有効にすると、OAuthフローは、必要に応じて新しいアクセストークンを要求するために使用できる更新トークンを生成します。あなたもこれが起こっていることに気付かないかもしれません。PHPクライアントライブラリがこのほとんどを処理します。

ただし、この更新トークンにはコストがかかります。あなたはそれを保存する責任があります。紛失した場合、別のアプリケーションを発行するには、ユーザーがアプリケーションを再承認する必要があります。保存方法は、実装の詳細に大きく依存します。セッションデータは、十分な耐久性を持たせることができれば、これを行うための合理的な方法です。

于 2012-04-12T01:41:18.990 に答える
1

これは古い質問ですが、答えは完全ではなかったようです。

受け入れられた回答は、ユーザーがGoogle Authサーバーを経由するように機能し、Auth画面は表示されません。問題は、トークンを保存して、ユーザーをGoogleサーバーに送信せずに再度使用することでした。

したがって、それが必要な場合(そして、ユーザーが現在アプリを使用していない場合でもユーザーデータにアクセスできるようになります)、必要なのは、更新トークンを含むアクセストークンを要求することだけです。

$client->setAccessType("offline");これを行うには、オフラインアクセスタイプ(ちなみに、これはもはやデフォルトではありません)を使用します-たとえば、php:。

受け取るアクセストークンには、ユーザーによる最初の初期認証にのみ更新トークンが含まれることに注意してください。これを保存する必要があります。

そうすれば、有効期限が切れている場合でも、そのアクセストークンをクライアントで使用でき、クライアントがトークンの更新と新しいトークンの取得を処理します。

お役に立てば幸い、アモス

于 2015-09-26T16:48:46.047 に答える