尝试使用OATH2对Google AnalyticsAPI(v3)进行身份验证时,我遇到以下错误:
警告:openssl_sign()期望参数4为long,在第60行的google-api-php-client / src / auth / Google_P12Signer.php中给出字符串
Google_AuthException:无法在第61行的google-api-php-client / src / auth / Google_P12Signer.php中签署数据
这是我的PHP代码:
// api dependencies
require_once(dirname(__FILE__) . '/../../vendor/google-api-php-client/src/Google_Client.php');
require_once(dirname(__FILE__) . '/../../vendor/google-api-php-client/src/contrib/Google_AnalyticsService.php');
session_start();
// create client object and set app name
$client = new Google_Client();
$client->setApplicationName(APP_NAME);
// set assertion credentials
$client->setAssertionCredentials(
new Google_AssertionCredentials(
'xxxxxxx@developer.gserviceaccount.com',
array('https://www.googleapis.com/auth/analytics.readonly'),
file_get_contents('xxxxxxxxxx-privatekey.p12') // keyfile
));
// other settings
$client->setClientId('xxxxxxx.apps.googleusercontent.com');
$client->setAccessType('offline_access');
// create service
$service = new Google_AnalyticsService($client);
$properties = $service->management_webproperties->listManagementWebproperties("~all");
print_r($properties);
如果我print_r($ service)我得到一个没有错误的有效对象。 listManagementWebproperties()调用会生成错误。
有人请求解决方案吗?看起来Google_Client可能会不断变化,因为它仅在几天前编辑过。我是通过SVN从trunk获得的,而不是通过我认为有不支持服务帐户的旧版本的下载页面。感谢。
答案 0 :(得分:0)
根据openssl_sign()
PHP文档,第4个参数应为 int 。
http://php.net/manual/en/function.openssl-sign.php
bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, int $signature_alg = OPENSSL_ALGO_SHA1 ] )
在Google_P12Signer的代码中,他们正在使用它:
if (!openssl_sign($data, $signature, $this->privateKey, "sha256")) {
throw new Google_AuthException("Unable to sign data");
}
传递“sha256”,这显然不是INT。根据这个:http://www.php.net/manual/en/openssl.signature-algos.php没有为 sha256 定义的OPENSSL_ALGO_ *,这意味着它不起作用。
您需要做的是定义自己的OPENSSL_ALGO_SHA256,就像您在此代码中看到的那样:http://pastebin.com/qdCyC0Pe
有人写了一个补丁来帮助:http://php.it2y.info/missing-sha256-sha512-families-of-signature-algorithms.html