1

最初のタスクは次のように簡単です:Google+ページから最新の投稿を入手してください。サーバーアプリケーションでGoogle APIにログインしてGoogle Plusを使用するにはどうすればよいですか?

インターネット上のすべての例が古くなっているか間違っているか、有効でないように見えるのは3日かかりました。 Googleの開発者向けドキュメントでも、多大な助けは得られず、混乱しているドキュメントのページごとにますます複雑化しています。だから、みんな、私はあきらめている。

まず、ドキュメント(https://developers.google.com/identity/protocols/OAuth2WebServer)に記載されているOAuth 2.0プロシージャを実装しようとしました。そのタイトルが示すように、それはまさにサーバーアプリケーションからの接続です。私はそれに従って、一見、それは働いた:私はバックコールを取得し、正常に認証され、アクセストークンを取得し、それを格納し、ポストをフェッチする簡単な呼び出しを行った。

// Initialization 

$this->googleClient = new Google_Client(); 
$this->googleClient->setAuthConfig(Json::decode($config->get('client_json'))); 
$this->googleClient->setAccessType('offline'); 
$this->googleClient->setIncludeGrantedScopes(TRUE); 
$this->googleClient->addScope('https://www.googleapis.com/auth/plus.me'); 
$this->googleClient->setRedirectUri(Url::fromRoute('mymodule.gplus.callback')->setAbsolute()->toString()); 

// The callback 

$client->authenticate($code); 
$accessToken = $client->getAccessToken(); 

(ここでは愚かに思えただけの事は - スコープである私は、私はちょうど公開ページから公開の投稿を読むために必要がある場合は、私が主張すべきかスコープわからなかったので、私はちょうど最初に選びました。関連見えたランダムエントリー)

私は、トークンを持って、私の記事を取得することができると言いましたよう:

// Using Google_Service_Plus 

$this->client()->setAccessToken($access_token); 
$this->googleServicePlus = new Google_Service_Plus($this->client($reset)); 
$this->googleServicePlus->activities->listActivities($endpoint, 'public', ['maxResults' => 1]); 

しかし、1時間後に、それはちょうどトークンが古いか何かであると主張して動作を停止し、それが必要リフレッシュする。そして、ここでショーストッパーが来る:私はトークンをリフレッシュする方法がないことが分かった。 $responseから authenticate()まではリフレッシュトークンは返されません(他の回答で何度も言及されていますが)ので、リフレッシュする方法はありません。

私は(私のcomposer.jsonから:"google/apiclient": "^2.0")をライブラリに掘ってみましたとauthenticate()方法は、実際のトークンと遊ぶように見えるいくつかの他の方法がある非推奨されていることを考え出しました。 https://developers.google.com/identity/protocols/OAuth2ServiceAccount

は、だから私は私がしたすべてを放棄し、新しい何かを実装する必要があります。私は完全に別のトピックと認証の方法は、ここで説明するために私たちをリードしている...いくつかアプリケーションデフォルトクレデンシャルを求め\Google_Client::fetchAccessTokenWithAssertion()を試してみましたか?どのようにすれば、私はこの簡単なニュースを取り出すことができますか?

長い質問申し訳ありません。

答えて

0

あなたが従うプロセスは良好です。問題は、トークンをリフレッシュすることです。公式ドキュメントの状態が、:

は、Google APIクライアントライブラリを使用する場合は限り、あなたはオフラインアクセスのために、そのオブジェクトを設定するよう、必要に応じて、クライアントオブジェクトは、アクセストークンを更新します。

PHPクライアントライブラリの使用方法については説明していません。これは私にとっても問題でした。これは私が取っているアプローチであり、うまくいけばそれはあなたを助けることができます。

// 1. Build the client object 
$client = new Google_Client(); 
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php'); 
$client->setAuthConfig("client_secret.json"); 
$client->addScope($scopes); 
$client->setAccessType("offline"); 

私は通常、セッションにアクセストークンを保存します。したがって、先に進む前に、アクセストークンがセッションに既に保存されているかどうかを確認します。そうであれば、アクセストークンがすでに期限切れになっているかどうかを確認します。そうであれば、私はアクセストークンをリフレッシュするように進んで、API呼び出しを進めます。

// 2. Check if the access token is already saved to session 
if(isset($_SESSION["access_token"]) && ($_SESSION["access_token"])) { 

    //set access token before checking if already expired 
    $client->setAccessToken($_SESSION["access_token"]); 

    //check if access token is already expired and refresh if so 
    if ($client->isAccessTokenExpired()) { 
     $refreshToken = $_COOKIE["refresh_token"]; //get refresh token 
     $client->refreshToken($refreshToken); // refresh the access token 
    } 

    //get new access token and save it to session 
    $_SESSION['access_token'] = $client->getAccessToken(); 

    // set access token after checking if already expired 
    $client->setAccessToken($_SESSION["access_token"]); 

    $plusService = new Google_Service_Plus($client); 

    $optParams = array(
     "maxResults" => 5, 
     "pageToken" => null 
    ); 

    $activitiesList = $plusService->activities->listActivities("+cnn", "public", $optParams); 

    $activities = $activitiesList->getItems(); 

    foreach ($activities as $activity) { 
     print_r($activity); 
     print "<br>**********************<br>"; 
    } 


} 

アクセストークンをセッションに保存されていない場合、これは、認証と承認が行われていないことを意味するので、私は、ユーザーを認証するために進んでください。

// 3. Authenticate user since access token is not saved to session 
else { 

    if(!isset($_GET["code"])){ //get authorization code 

    $authUrl = $client->createAuthUrl(); 
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 

    } else { //exchange authorization code for access token 

    $client->authenticate($_GET['code']); //authenticate client 

    //get access token and save it to session 
    $_SESSION['access_token'] = $client->getAccessToken(); 

    //save refresh token to a Cookie 
    $refreshToken = $_SESSION["access_token"]["refresh_token"]; 
    setcookie("refresh_token", $refreshToken, time() + (86400 * 30), "/"); 

    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/index.php'; 
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 

    } 

} 

ご注意:デモンストレーションの目的のために、私はこの例では、クッキーとリフレッシュトークンを保存しています。しかし、この情報をクッキーに保存するのではなく、安全なデータベースに保存すべきであることはよく知られています。また、authenticate()メソッドは非推奨ではなく、メソッドfetchAccessTokenWithAuthCode()の単なるエイリアスです。もう一つは、あなたが使用しているスコープを使用すると、ドキュメントherehereによると、公開ページから情報を取得しているため、愚かはありませんが、私は私だけへのアクセスがGoogleで誰であるか知っている可能にするべきであることを直感しましたhttps://www.googleapis.com/auth/plus.me

関連する問題