在 Laravel 5 中加载 GOOGLE_APPLICATION_CREDENTIALS

Posted

技术标签:

【中文标题】在 Laravel 5 中加载 GOOGLE_APPLICATION_CREDENTIALS【英文标题】:Loading GOOGLE_APPLICATION_CREDENTIALS in Laravel 5 【发布时间】:2018-03-05 22:33:45 【问题描述】:

我正在使用 Laravel 5.2,我按照官方文档中的建议使用 php artisan config:cache 以提高速度。

您可能知道,此命令使 .env 文件变量无法直接访问(您可以使用 php artisan tinker 对其进行测试),因此所有对 env()getenv() 函数的调用都必须替换为 @代码中的987654326@,除了config文件夹中的文件。执行此命令后,env('APP_ENV') 等调用返回 NULL。

在我的项目中,我使用 google-auth-library-php 连接到 Google Cloud。不幸的是,在 CredentialsLoader.php 文件中有一个对函数 getenv(self::ENV_VAR) 的调用,该函数试图获取 Google 凭据文件的路径。当我运行命令php artisan config:cache时,无法从.env文件中读取路径,无法完成连接。

我可以看到 3 种方式继续:

    忘记运行php artisan config:cache。 在这里询问是否有人知道如何将 Google 凭据文件的路径指定为包的任何函数的参数。 (请原谅我,上帝)更正 CredentialsLoader.php 文件(getenv()config()),运行命令并在存储库中跟踪此文件,然后此更改将在每个团队成员拉取时传播。

提前谢谢你!

【问题讨论】:

从 env 加载的是 CredentialsLoader::fromEnv。在 CredentialsLoader 上使用另一种方法是有意义的,或者使用配置中的设置手动创建凭据。 嗨!现在已经 3 年了... :) 你的解决方案是什么? 好吧,实际上我是用一个特定的配置完成的...... Nignx + php 和 fastcgi。我会回答,因为如果将来有人会再次访问这个问题,也许会有所帮助 【参考方案1】:

这是一个非常古老的问题,但即使在较新版本的 Laravel 中,它也可能对遇到同样问题的人有用。 基本上我没有适用于所有可能环境的解决方案,但它给出了这个想法。 我的环境运行php7.4-fpmnginx。 如果您使用相同的环境,您的 php 文件将有一个 location 指令。 Nginx 可以用fastcgi_param 设置FastCGI 参数,你可能已经用过SCRIPT_FILENAME 等。 然后可以添加

location ~ \.php$ 
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    [...]
    fastcgi_param GOOGLE_APPLICATION_CREDENTIALS "/absolute/path/to/keyfile.json";

然后只需重新加载 Nginx(例如,对于 Ubuntu 20.04,sudo systemctl reload nginx)。

对于 Apache,同样的想法可能适用于 SetEnv https://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv

【讨论】:

【参考方案2】:

如果还是遇到这个错误,可以在第一个参数中使用keyFileindex指定文件:

$storage = new StorageClient([
   'keyFile' => json_decode(file_get_contents($path), true),
]);

或者您可以使用keyFilePath index 直接指定 .json 文件进行配置

$storage = new StorageClient([
   'keyFilePath' => '/path/to/json/CompanyDataStorage-foobarbaz.json',
]);

【讨论】:

以上是关于在 Laravel 5 中加载 GOOGLE_APPLICATION_CREDENTIALS的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5未在子文件夹中加载图像

在 laravel 中加载作曲家类

在laravel中加载一个作曲家类

阻止:在 HTTPS 中加载 Laravel CSS 和 JS 时出现混合内容错误

如何在 Laravel 中加载嵌套关系

Laravel 在模态窗口中加载外部 URL