在localhost

时间:2016-01-27 23:20:36

标签: php google-app-engine ssl curl

我正在开发一款我将在Google App Engine(GAE)中运行的应用,该应用需要访问GDrive API。当它在云端运行时,我可以使用我的特殊域范围授权,以便我的用户自动进行身份验证,我可以毫无问题地使用gdrive api。这很有效。

但是,在localhost上进行测试时,域范围的身份验证将无效,因为我们localhost实际上并未对您的Google帐户进行身份验证,您只能声称自己是您想要的任何人。所以,我正在做的是在localhost和GAE中以不同方式实例化我的google $client。在GAE中,我使用特殊的域范围的auth, on localhost然后我使用传统的Google客户端配置,其中包含客户端ID,客户端密钥,oauth令牌处理等。

我重定向到Google,我告诉Google允许访问,然后Google将我重定向回localhost以完成oauth进程。当我从谷歌中取出code并致电:

$client->authenticate($authcode);

我收到有关缺少CA捆绑包的SSL错误。

  

在任何常见系统中都找不到系统CA捆绑包   位置。早于5.6的PHP版本未正确配置   默认情况下使用系统的CA包。为了验证同行   证书,你需要提供磁盘上的路径   证书捆绑到'verify'请求选项:   http://docs.guzzlephp.org/en/latest/clients.html#verify。如果你不   需要一个特定的证书包,然后Mozilla提供一个常见的   使用的CA捆绑包可以在这里下载(由   cURL的维护者):   https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt。   在磁盘上提供CA捆绑包后,您可以设置   'openssl.cafile'PHP ini设置指向文件的路径,   允许您省略“验证”请求选项。看到   http://curl.haxx.se/docs/sslcerts.html了解更多信息。

我已经下载了.crt文件,我也尝试下载他们的.pem文件,我尝试以几种方式配置我的php.ini以使其使用这些文件......

openssl.cafile="/path/to/ca-bundle.crt"

openssl.cafile="/path/to/cacert.pem"

curl.cainfo="/path/to/ca-bundle.crt"

curl.cainfo="/path/to/cacert.pem"

但它们似乎都没有起作用或有所作为。我错过了什么?

编辑:

告诉我在生产和本地主机上验证相同意味着你不明白我在问什么或者我需要使用客户端的原因。我的问题是关于证书。

1 个答案:

答案 0 :(得分:3)

我终于找到了解决方案from this answer,请将他们的答案付诸表决。

  

查看Google和Guzzle的代码,您可能需要指定   通过执行类似的操作可以找到证书包   您在设置Google客户端之前和之前的时间   authenticate()调用:

$client->setHttpClient(new GuzzleHttp\Client(['verify'=>'path\to\your\cert-bundle']));
     

这将覆盖默认行为并让您指定的位置   捆绑是。