背景
Laravel Passport導入の過程で php artisan passport:install
を実施すると、 storage
ディレクトリ配下に
- oauth-private.key
- oauth-public.key
の暗号キーファイルが生成される。これはアクセストークンの発行や認証時に利用されるので、保持する必要がある。管理方法としてはリポジトリにコミットする方法が一番簡単ではあるが、公開リポジトリの場合だとセキュリティ上の都合それは出来ない。
S3で管理してデプロイ時に都度取得する方法がQiitaにあったが、独自調整をすると今後のアップグレードの妨げになるので、既存の仕様に沿った方法で対応したい。
どうすれば良いのか。
結論
- Passport v6.0.0から導入された暗号キー情報のconfig管理方法を導入すれば良い
動作環境
- Laravel v5.6.26
- Laravel Passport v7.0.1
- 【注意】phpdotenv v2.5.1 または v 2.4.0
- 注意の理由は後述する
導入手順
- laravel/passportのconfig/passport.phpファイルを、アプリケーションのconfigディレクトリ配下にコピペ
-
.env
に以下を追加
oauth-private.key
,oauth-public.key
の改行コードを変換してPASSPORT_PRIVATE_KEY
,PASSPORT_PUBLIC_KEY
に貼り付ける
phpdotenv v.2.5.1の場合
- 改行コードを
\\n
に変換
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
に変換
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
なので2018年4月5日の時点では \n
で動作していたから、以下のIssueではそのように案内されていたんですねぇ。
Add ability to set encryption keys from config by reinink · Pull Request #683 · laravel/passport · GitHub
.env
にはどう書けばいいのか?
個人的にはphpdotenvのバージョンを 2.4.0
に固定しておいて、phpdotenv側で解決してからバージョンアップした方が安全だと思われる。現状のまま2系の最新を使用し続けて、知らぬ間に仕様が変わると認証できなくなる危険すらあるので。
まとめ
コンフィグファイルと .env
でPassportの暗号キーを管理する方法は、ドキュメントには記載は無いが、公式に提供されている手法なので安心して使って良いと思う。基本的にはリポジトリに保持する方法が楽だと思うが、それが出来ない場合のみに本手法を取ると良いと考える。
とはいえ、改行コードを変換するのは手間なので、phpdotenv側でvalueの複数行をサポートしてほしい。 Multiline support by Korbeil · Pull Request #271 · vlucas/phpdotenv · GitHub で進行中なので楽しみ。