Laravel Passportの暗号キー情報を環境変数(.envファイル)で保持する方法

## 背景
Laravel Passport導入の過程で `php artisan passport:install` を実施すると、 `storage` ディレクトリ配下に

* oauth-private.key
* oauth-public.key

の暗号キーファイルが生成される。これはアクセストークンの発行や認証時に利用されるので、保持する必要がある。管理方法としてはリポジトリにコミットする方法が一番簡単ではあるが、公開リポジトリの場合だとセキュリティ上の都合それは出来ない。

[S3で管理してデプロイ時に都度取得する方法](https://qiita.com/kawax/items/59fde47056816cec52ec)がQiitaにあったが、独自調整をすると今後のアップグレードの妨げになるので、既存の仕様に沿った方法で対応したい。

どうすれば良いのか。

## 結論
* Passport  v6.0.0から導入された暗号キー情報のconfig管理方法を導入すれば良い
	*  [Add ability to set encryption keys from config by reinink · Pull Request #683 · laravel/passport · GitHub](https://github.com/laravel/passport/pull/683)

## 動作環境
* Laravel  v5.6.26
* Laravel Passport  v7.0.1
* 【注意】phpdotenv v2.5.1 または v 2.4.0
	* 注意の理由は後述する

## 導入手順
1. [laravel/passport](https://github.com/laravel/passport)の[config/passport.php](https://github.com/laravel/passport/blob/7.0/config/passport.php)ファイルを、アプリケーションのconfigディレクトリ配下にコピペ
2.  `.env`に以下を追加
`oauth-private.key` , `oauth-public.key` の改行コードを変換して `PASSPORT_PRIVATE_KEY`, `PASSPORT_PUBLIC_KEY` に貼り付ける

### phpdotenv v.2.5.1の場合
* 改行コードを `\\n`に変換

```sh
PASSPORT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\\nMIIJJwIBAAKCAgEAw3KPag...\\n-----END RSA PRIVATE KEY-----"
PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\\nMIICIjANBgkqhkiG9w0BAQEFAAOC...\\n-----END PUBLIC KEY-----"
```

### 【オススメ】phpdotenv v.2.5.0未満の場合
* 改行コードを `\n`に変換

```sh
PASSPORT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIJJwIBAAKCAgEAw3KPag...\n-----END RSA PRIVATE KEY-----"
PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOC...\n-----END PUBLIC KEY-----"
```

### なぜ 改行コードを `\n`ではなく `\\n` に変換しないといけないのか？
phpdontenv のバグ？（個人的にはそう思っている）により、v 2.5.0以降はvalue内で `\n`を混ぜるをkeyから値取得時に空になってしまう。なので、`\\n`にする必要がある。2018年7月4日に本件について報告されているが、未だ未解決。
refs:  [Variables with \n converted to empty strings (after last updating) · Issue #279 · vlucas/phpdotenv · GitHub](https://github.com/vlucas/phpdotenv/issues/279)

なので2018年4月5日の時点では `\n` で動作していたから、以下のIssueではそのように案内されていたんですねぇ。
[Add ability to set encryption keys from config by reinink · Pull Request #683 · laravel/passport · GitHub](https://github.com/laravel/passport/pull/683#issue-179533568)

### `.env` にはどう書けばいいのか？
個人的にはphpdotenvのバージョンを `2.4.0`に固定しておいて、phpdotenv側で解決してからバージョンアップした方が安全だと思われる。現状のまま2系の最新を使用し続けて、知らぬ間に仕様が変わると認証できなくなる危険すらあるので。

## まとめ
コンフィグファイルと `.env`でPassportの暗号キーを管理する方法は、ドキュメントには記載は無いが、公式に提供されている手法なので安心して使って良いと思う。基本的にはリポジトリに保持する方法が楽だと思うが、それが出来ない場合のみに本手法を取ると良いと考える。

とはいえ、改行コードを変換するのは手間なので、phpdotenv側でvalueの複数行をサポートしてほしい。 [Multiline support by Korbeil · Pull Request #271 · vlucas/phpdotenv · GitHub](https://github.com/vlucas/phpdotenv/pull/271) で進行中なので楽しみ。

## 参考
* [API認証\(Passport\) 5\.6 Laravel](https://readouble.com/laravel/5.6/ja/passport.html)
* [Laravel Passport keyファイルの扱い \- Qiita](https://qiita.com/kawax/items/59fde47056816cec52ec)
* [Add ability to set encryption keys from config by reinink · Pull Request \#683 · laravel/passport](https://github.com/laravel/passport/pull/683#issue-179533568)
* [Variables with \n converted to empty strings (after last updating) · Issue #279 · vlucas/phpdotenv · GitHub](https://github.com/vlucas/phpdotenv/issues/279)