1

我正在升级我曾经为 google fusion 表制作的 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;
    }
}

我收到这个错误

在此处输入图像描述

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

这是一个解决方案如何使用 Google API PHP 客户端获取 OAuth2 访问令牌?

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

1 回答 1

2
  1. 使用服务帐户。服务帐户标识服务(例如:网站)而不是人。由于需要访问融合表的是您的站点 - 而不是您 - 服务帐户是要走的路。(另一种选择是让您的用户一个一个地对您的融合表进行身份验证。这将要求您的所有用户都有一个谷歌帐户和您的网站为他们授予权限。现在我们不想通过所有的麻烦,是吗?)

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

  3. 忘记卷曲。下载Google API PHP 客户端。在引擎盖下,它仍然会使用 curl,但会让你头疼。

  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
    
于 2013-10-23T09:16:43.840 回答