将Google Fusion Tables升级到Google API V.1

时间:2013-10-22 18:29:02

标签: php joomla2.5 google-fusion-tables

我正在升级我曾经为谷歌融合表制作的joomla组件。我下载了新的php api。但是我对如何使用oauth开发我的网站和一些东西有一些疑问。

所以我的网站读取融合表并允许我的(Joomla)用户更改,删除或添加数据到任何这些表。所以我的问题是,我是否需要一个Web应用程序类型或服务帐户的客户端登录。使用服务帐户似乎更合乎逻辑。如果是这样,我如何使用php和google php api框架进行连接。

$clientlogin_curl = curl_init();
    curl_setopt($clientlogin_curl,CURLOPT_URL,'https://www.google.com/accounts/ClientLogin');
    curl_setopt($clientlogin_curl, CURLOPT_POST, true); 
    curl_setopt ($clientlogin_curl, CURLOPT_POSTFIELDS,
        "Email=".$username."&Passwd=".$password."&service=fusiontables&accountType=GOOGLE");
    curl_setopt($clientlogin_curl,CURLOPT_CONNECTTIMEOUT,2);
    curl_setopt($clientlogin_curl,CURLOPT_RETURNTRANSFER,1);
    $token = curl_exec($clientlogin_curl);
    curl_close($clientlogin_curl);
    $token_array = explode("=", $token);
    $token = str_replace("\n", "", $token_array[3]);

上面是我以前的连接方式,但现在我的配额超出了,因为它已被弃用。

我正在阅读此内容https://code.google.com/p/google-api-php-client/wiki/OAuth2,并且在服务帐户部分中未提及Fusion Tables。如果不是我的重定向uri应该是什么

修改

这是我现在的代码

jimport('gft-jdc.oauth-php.src.Google_Client');
jimport('gft-jdc.oauth-php.src.contrib.Google_PlusService');

const CLIENT_ID = 'XXXXXXXXXXXXXXXXXXXXXXX7pu.apps.googleusercontent.com';
const SERVICE_ACCOUNT_NAME = 'XXXXXXXXXXXXXXXXXXXpu@developer.gserviceaccount.com';
const KEY_FILE = '/home/jdc/workspace/xxxxxxxxxxxxxxxprivatekey.p12';


class ClientLogin {
    public static function getAuthToken($username, $password) {      
        $client = new Google_Client();
        $client->setApplicationName("API Project");
        var_dump(CLIENT_ID);
        var_dump(KEY_FILE);
        $client->setClientId(CLIENT_ID);

        // Set your cached access token. Remember to replace $_SESSION with a
        // real database or memcached.
        if (isset($_SESSION['token'])) {
            $client->setAccessToken($_SESSION['token']);
        }

        // Load the key in PKCS 12 format (you need to download this from the
        // Google API Console when the service account was created.
        $key = file_get_contents(KEY_FILE);

        $client->setAssertionCredentials(new Google_AssertionCredentials(
                SERVICE_ACCOUNT_NAME,
                array('https://www.googleapis.com/auth/fusiontables'),
                $key)
        );

        $client->authenticate();

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

        var_dump($token);

        return $token;
    }
}

我收到此错误

enter image description here

解决方案下, 我刚解决了最后一个问题,你不需要$ client-> authenticate()

以下是解决方案How to get OAuth2 access token with Google API PHP client?

if ($client->getAuth()->isAccessTokenExpired()) {
            $client->getAuth()->refreshTokenWithAssertion();
        }

1 个答案:

答案 0 :(得分:2)

  1. 使用服务帐户。服务帐户标识服务(例如:网站)而不是人。由于您的网站需要访问融合表 - 而不是您 - 服务帐户才是最佳选择。 (另一种选择是让您的用户逐一对您的融合表进行身份验证。这将要求您的所有用户都拥有一个Google帐户和您的网站以获得他们的许可。现在我们不想通过所有的麻烦,是吗?)

  2. 使用API Console创建服务帐户。请注意您的帐户名称,客户ID。生成并下载.p12私钥文件。创建服务帐户后,与服务帐户的电子邮件地址(xxxx@developer.gserviceaccount.com)共享(a.k.a:授予权限)您的融合表

  3. 忘记卷曲。下载Google API PHP Client。在引擎盖下,它仍将使用卷曲,但可以避免头痛。

  4. 在您的代码中包含api客户端并进行身份验证。

    require_once '<path>/src/Google_Client.php';
    require_once '<path>/src/contrib/Google_FusiontablesService.php';
    
    $CLIENT_ID = 'xxx.apps.googleusercontent.com';
    $SERVICE_ACCOUNT_NAME = 'xxx@developer.gserviceaccount.com';
    $KEY_FILE = '<path to your .p12 file>'; //this should not be reached by any of your site's visitors
    
    $client = new Google_Client();
    $client->setApplicationName("whatever");
    $client->setClientId($CLIENT_ID);
    $client->setAssertionCredentials(new Google_AssertionCredentials(
        $SERVICE_ACCOUNT_NAME,
        array('https://www.googleapis.com/auth/fusiontables'),
        file_get_contents($KEY_FILE)
    );  
    $client->authenticate();
    
    
    //do whatever you need to do with your fusion table on behalf of the user