Laravel Passport和Heroku在哪里存储加密密钥?

时间:2018-01-12 10:53:24

标签: laravel heroku laravel-passport

我正在尝试使用Heroku部署Laravel应用程序,该应用程序使用Laravel Passport。

每次部署应用程序时,重建slug都会导致Laravel Passport加密密钥被删除。这意味着每次部署应用程序时都会:

  1. 应更改存储文件夹权限
  2. 应生成新的加密密钥
  3. 所有现有的令牌都是不可加密的
  4. 目前,我最终得到的解决方案是将OAuth私钥和公钥存储在两个不同的Heroku配置变量(a.k.a。环境变量)中。我扩展了PassportServiceProvider类,如果环境设置为"生产":

    ,它会在环境变量中查找加密密钥。
    1. 我在PassportServiceProvider中创建了一个新的app/Providers课程:
    2. <?php
      
      namespace App\Providers;
      
      use Laravel\Passport\PassportServiceProvider as LaravelPassportServiceProvider;
      use League\OAuth2\Server\AuthorizationServer;
      use League\OAuth2\Server\CryptKey;
      use League\OAuth2\Server\ResourceServer;
      
      class PassportServiceProvider extends LaravelPassportServiceProvider
      {
          protected function registerResourceServer()
          {
              $publicKeyPath = config('app.env') === 'production' ? env('OAUTH_PUBLIC_KEY') : 'oauth-public.key';
      
              $this->app->singleton(ResourceServer::class, function () use ($publicKeyPath) {
                  return new ResourceServer(
                      $this->app->make(\Laravel\Passport\Bridge\AccessTokenRepository::class),
                      $this->makeCryptKey($publicKeyPath)
                  );
              });
          }
      
          public function makeAuthorizationServer()
          {
              $privateKeyPath = config('app.env') === 'production' ? env('OAUTH_PRIVATE_KEY') : 'oauth-private.key';
      
              return new AuthorizationServer(
                  $this->app->make(\Laravel\Passport\Bridge\ClientRepository::class),
                  $this->app->make(\Laravel\Passport\Bridge\AccessTokenRepository::class),
                  $this->app->make(\Laravel\Passport\Bridge\ScopeRepository::class),
                  $this->makeCryptKey($privateKeyPath),
                  app('encrypter')->getKey()
              );
          }
      
          protected function makeCryptKey($key)
          {
              if (config('app.env') === 'production') {
                  return new CryptKey(str_replace('\n', "\n", $key), null, false);
              }
      
              return new CryptKey(file://'.Passport::keyPath($key), null, false);
          }
      }
      
      1. 将以下行附加到providers中的config/app.php数组:
      2. Api\Providers\PassportServiceProvider::class,
        
        1. 告诉Laravel不要自动发现Laravel Passport包。在composer.json
        2. "extra": {
              "laravel": {
                  "dont-discover": [
                      "laravel/passport"
                  ]
              }
          }
          

          由于this issue,此解决方案本身并不完全正常。

          但我不相信这是正确的做法。我想知道是否有人已经面临这个问题。如果是这样,你是如何解决的?

          提前谢谢。

0 个答案:

没有答案