我正在升级我曾经为谷歌融合表制作的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()
以下是解决方案How to get OAuth2 access token with Google API PHP client?
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
答案 0 :(得分:2)
使用服务帐户。服务帐户标识服务(例如:网站)而不是人。由于您的网站需要访问融合表 - 而不是您 - 服务帐户才是最佳选择。 (另一种选择是让您的用户逐一对您的融合表进行身份验证。这将要求您的所有用户都拥有一个Google帐户和您的网站以获得他们的许可。现在我们不想通过所有的麻烦,是吗?)
使用API Console创建服务帐户。请注意您的帐户名称,客户ID。生成并下载.p12私钥文件。创建服务帐户后,与服务帐户的电子邮件地址(xxxx@developer.gserviceaccount.com)共享(a.k.a:授予权限)您的融合表
忘记卷曲。下载Google API PHP Client。在引擎盖下,它仍将使用卷曲,但可以避免头痛。
在您的代码中包含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