laravel
Passport
laravel5.6

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


背景

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


  • oauth-private.key

  • oauth-public.key

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

S3で管理してデプロイ時に都度取得する方法がQiitaにあったが、独自調整をすると今後のアップグレードの妨げになるので、既存の仕様に沿った方法で対応したい。

どうすれば良いのか。


結論


動作環境


  • Laravel v5.6.26

  • Laravel Passport v7.0.1

  • 【注意】phpdotenv v2.5.1 または v 2.4.0


    • 注意の理由は後述する




導入手順



  1. laravel/passportconfig/passport.phpファイルを、アプリケーションのconfigディレクトリ配下にコピペ

  2. .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 で進行中なので楽しみ。


参考