我一直在搜索google-api-php-client的新旧版本以及各种其他示例,但我似乎无法绕过这个错误。 下面的代码是从GitHub检索到的服务帐户示例,我从API控制台中删除了我的凭据和文件。我有一个我正在构建的不同文件,但是为了在这个问题中使用,我认为这个更简单的文件会更容易讨论。我对这两个文件都有同样的错误。
致命错误:未捕获的异常'Google_Auth_Exception',并显示消息'无法解析p12文件。这是一个.p12文件吗?密码是否正确? OpenSSL错误:第52行的/google-api-php-client/src/Google/Signer/P12.php
我完全不知道为什么会抛出这个错误。
我已经验证“file_get_contents”实际上是获取文件的内容并且我的“notasecret”密码被正确拉出。我希望this recent commit可能有所帮助,但不幸的是,它并没有为我解决这个错误。
知道这里出了什么问题吗?谢谢你的任何建议!
<?php
session_start();
include_once "templates/base.php";
set_include_path("../src/" . PATH_SEPARATOR . get_include_path());
require_once 'Google/Client.php';
require_once 'Google/Service/Books.php';
$client_id = 'xxxx.apps.googleusercontent.com';
$service_account_name = 'xxxx@developer.gserviceaccount.com';
$key_file_location = 'xxxx-privatekey.p12';
echo pageHeader("Service Account Access");
if ($client_id == 'xxxx.apps.googleusercontent.com'
|| !strlen($service_account_name)
|| !strlen($key_file_location)) {
echo missingServiceAccountDetailsWarning();
}
$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$service = new Google_Service_Books($client);
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/books'),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();
$optParams = array('filter' => 'free-ebooks');
$results = $service->volumes->listVolumes('Henry David Thoreau', $optParams);
echo "<h3>Results Of Call:</h3>";
foreach ($results as $item) {
echo $item['volumeInfo']['title'], "<br /> \n";
}
echo pageFooter(__FILE__);
答案 0 :(得分:3)
我也遭遇了这个错误,在我的情况下,问题是.p12文件只有所有者的读取权限,没有组和其他人的访问权限。为此,我花了两天的时间......
现在我收到错误&#34;用户对此个人资料没有足够的权限&#34;但至少是新事物!!
答案 1 :(得分:3)
我偶然发现了同样的问题。将p12文件转换为.pem(正如theonlynewts建议的那样)并不适用于我。没有&#34; --- BEGIN RSA私人钥匙---&#34; .pem文件中的部分
但奇怪的是,虽然这不起作用(来自Google的P12.php的原始代码):
if (!openssl_pkcs12_read( $p12, $certs, $password)) { ...
这项工作:
$pkcs12 = file_get_contents( $p12 );
if (!openssl_pkcs12_read( $pkcs12, $certs, $password)) { ...
(在Kubuntu 14.04上的PHP 5.5.9上测试)
答案 2 :(得分:1)
知道了! This commit让我想到也许openssl也不喜欢我们的文件。我使用these instructions将文件从p12转换为pem。然后我编辑了文件以删除“----- BEGIN RSA私钥-----”之前的一些文本,因此新提交的代码将正确识别它。删除该文件并获得像魔术一样的结果。
就是这样!我仍然不确定是什么原因会导致自动生成的p12文件不合作,所以如果有人有任何想法,请告诉我。
答案 3 :(得分:0)
我很确定你需要在这部分代码中的某处写下“notasecret”这个短语:
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/books'),
$key
);
'哪里?',是问题......
看起来它具有正确的代码:https://github.com/google/google-api-php-client/blob/master/src/Google/Auth/AssertionCredentials.php
我会在测试后更新我的答案以确认其有效。
:)
答案 4 :(得分:0)
这通常只是文件权限问题。确保运行apache的用户有权读取p12文件。
答案 5 :(得分:0)
我在解析p12文件时也遇到了麻烦。它始终显示错误,如“Undefined function openssl_pkcs12_read()”。 要摆脱此错误,首先必须检查php.ini文件。 打开php.ini然后搜索openssl然后取消注释该行。现在保存并重新启动所有wamp服务。
你的功能正在发挥作用。