0

これは、インターネット、特に StackOverflow でよく見られるトピックであることがわかりました。しかし、私が持っていない (またはまだ見ていない) のは、トークンがセッション全体で維持されるための直接的な解決策です。

PHP 用の Google API クライアント ライブラリを使用しています。

私のクエリ: PHP クライアント ライブラリから Google_Oauth2Service を使用してユーザー データ (名前など) をフェッチする index.php が 1 つあります。ユーザーは正常に認証され、すべてがうまくいきます。URL 短縮サービスを使用したいので、短い URL を取得するためのコードを含む short.php を作成します。これがうまくいかないこともあります。

index.php

//include google api files
require_once 'src/Google_Client.php';
require_once 'src/contrib/Google_Oauth2Service.php';
require_once 'src/contrib/Google_UrlshortenerService.php';

//start session
session_start();
$gClient = new Google_Client();
$gClient->setApplicationName('Test App');
$gClient->setClientId($google_client_id);
$gClient->setClientSecret($google_client_secret);
$gClient->setRedirectUri($google_redirect_url);
$gClient->setDeveloperKey($google_developer_key);

$google_oauthV2 = new Google_Oauth2Service($gClient);
....
....

ここでセッションを開始し、Google_Client のオブジェクトを作成しました。クライアント ID、シークレット、およびその他すべての詳細を宣言しました。

次に、認証が成功したときにアクセス トークンを取得し、Session 変数に格納して、short.php から (jQuery ajax を使用して) 短い URL を取得しようとするときに、既存のトークンを使用できるようにします。

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

現在、short.phpで

session_start();
require_once 'src/Google_Client.php';
require_once 'src/contrib/Google_Oauth2Service.php';
require_once 'src/contrib/Google_UrlshortenerService.php';

$gClient = new Google_Client();
$gClient->setApplicationName('Test App');
$gClient->setClientId($google_client_id);
$gClient->setClientSecret($google_client_secret);
$gClient->setRedirectUri($google_redirect_url);
$gClient->setDeveloperKey($google_developer_key);

....
if (isset($_SESSION['token']) && $_SESSION['token']) {

    // Set the access token from the session
    $gClient->setAccessToken($_SESSION['token']);   
    $url_service = new Google_UrlshortenerService($gClient);

    // Check if a URL has been passed
    if (isset($_GET['url'])) {  
            $url = new Google_Url();
        $url->longUrl = $_GET['url'];

        $shortURL = $url_service->url->insert($url);    
            ....

これは、コードが壊れている正確な行です$shortURL = $url_service->url->insert($url);。セッション変数を使用してトークンを取得し、成功した URL サービス オブジェクトを作成しました。しかし、挿入メソッドを呼び出すと、それが失敗します。

Apache エラー ログから:

husain@innovate:~/myprojects/web$ tail -1 /var/log/apache2/error.log | sed -e 's/\\n/\n/g'
[Thu Mar 28 00:42:35 2013] [error] [client 127.0.0.1] PHP Fatal error:  Uncaught exception 'Google_ServiceException' with message 'Error calling POST https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyCxfXP-xS-QYJw-7mM4SNG3EW9ryj_Oiv4: (401) Invalid Credentials' in /home/husain/myprojects/web/apps/src/io/Google_REST.php:66
Stack trace:
#0 /home/husain/myprojects/web/apps/src/io/Google_REST.php(36): Google_REST::decodeHttpResponse(Object(Google_HttpRequest))
#1 /home/husain/myprojects/web/apps/src/service/Google_ServiceResource.php(177): Google_REST::execute(Object(Google_HttpRequest))
#2 /home/husain/myprojects/web/apps/src/contrib/Google_UrlshortenerService.php(38): Google_ServiceResource->__call('insert', Array)
#3 /home/husain/myprojects/web/apps/shorten.php(44): Google_UrlServiceResource->insert(Object(Google_Url))
#4 {main}
  thrown in /home/husain/myprojects/web/apps/src/io/Google_REST.php on line 66

index.php ファイルと short.php ファイルに Google_Client 変数をダンプすると、次のようになります。

index.php

Google_Client Object
    (
    [scopes:protected] => Array

        (
        )

    [useObjects:protected] => 
    [services:protected] => Array
        (
            [oauth2] => Array
                (
                    [scope] => Array
                        (
                            [0] => https://www.googleapis.com/auth/userinfo.profile
                            [1] => https://www.googleapis.com/auth/userinfo.email
                        )

                )

        )

    [authenticated:Google_Client:private] => 
)

short.php

object(Google_Client)#1 (4) {
  ["scopes":protected]=>
  array(0) {
  }
  ["useObjects":protected]=>
  bool(false)
  ["services":protected]=>
  array(1) {
    ["urlshortener"]=>
    array(1) {
      ["scope"]=>
      string(44) "https://www.googleapis.com/auth/urlshortener"
    }
  }
  ["authenticated":"Google_Client":private]=>
  bool(false)
}

どちらも同じではないので、ここに何か問題があると思います。ヘルプまたは指示をお願いします。

4

1 に答える 1

0

認証時に UrlShortener スコープを要求していないため、失敗しています。スコープを追加するには、index.php で認証する前に UrlshortenerService を作成し、次のようにクライアントの同じインスタンスを渡します。

//start session
session_start();
$gClient = new Google_Client();
$gClient->setApplicationName('Test App');
$gClient->setClientId($google_client_id);
$gClient->setClientSecret($google_client_secret);
$gClient->setRedirectUri($google_redirect_url);
$gClient->setDeveloperKey($google_developer_key);

$google_oauthV2 = new Google_Oauth2Service($gClient);
$url_service = new Google_UrlshortenerService($gClient);

または、 setScopesを使用して、自動生成されたスコープをオーバーライドできます

于 2013-03-28T19:25:45.190 に答える