ASP.NET CoreでAPIキーなどの秘匿情報をsecret.jsonを使用して秘匿する
概要
ASP.NET Core MVCプロジェクトでこちらの公式ドキュメントのコードのまま実装しています。
しかし、このままではappsettings.json
をgit commitする際に除外するか書き換えるなどの面倒な方法をとっていました。
appsettings.json
と同じ使い方のできるsecrets.json
を作成してGit管理外とする方法は知ってはいたのですが
Windows環境(VisualStudio 2017)を使用した方法ばかりでMac環境で実行する方法がわからなかったのでそのメモです。
(VisualStudio 2017での追加方法はこちらの公式ブログで解説されています。)
目次
環境
参考サイト様
前提
$ dotnet new mvc -n hoge -au Individual
テンプレートから作成されたプロジェクトなので今回は問題ないが素で作成しているのであれば下記パッケージの追加が必要
- Microsoft.Extensions.Configuration.UserSecrets
現状
Twitter認証部分のコードです。公式ドキュメントのサンプルコードとほぼ変わりません。
今回はConnectionStrings
とAuthentication
部分をsecrets.json
へ移植します。
appsettings.json
{ "ConnectionStrings": { "DefaultConnection": "SQLServer用接続文字列", "MySQLConnection": "MySQL用接続文字列" }, "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "Authentication": { //Twitter APIキー "Twitter": { "ConsumerKey": "ConsumerKey", "ConsumerSecret": "ConsumerSecret" } } }
Startup.cs
public void ConfigureServices(IServiceCollection services) { //省略 services.AddAuthentication().AddTwitter(twitterOptions => { twitterOptions.ConsumerKey = Configuration["Authentication:Twitter:ConsumerKey"]; twitterOptions.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"]; //省略 }); //省略 }
secrets.json
の作成
公式ドキュメントのチュートリアルには下記のパスにディレクトリが存在するような記載がありますが存在しておらず頭を抱えていました。
~/.microsoft/usersecrets/<UserSecretsId>/secrets.json
※<UserSecretsId>
については.csproj
ファイルで確認可能なプロジェクトごとの一意なID
「~/
配下に.microsoft
なんてなくない...?」
とりあえずググりdotnet cliで作ることができるっぽいことがわかりました。
下記のdotnet user-secrets set <key> <value>
コマンドを実行すると上記パスの配下にsecrets.json
が作成されたことが確認できました。
※コマンドについては.csproj
ファイルが存在するディレクトリで実行すること
別パスで実行する場合は--project
オプションで.csproj
ファイルを指定する。
$ dotnet user-secrets set "hoge" "fuga" Successfully saved hoge = fuga to the secret store. $ ls -l ~/.microsoft/usersecrets/<UserSecretsId>/ total 8 -rw-r--r-- 1 z staff 495 3 5 01:15 secrets.json $ cat ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json { "hoge": "fuga" }
secrets.json
ができてしまえばこちらのものです。機密としたいTwitter APIキーとDB接続文字列をappsettings.json
から移植します。
- 編集した
secrets.json
{ "ConnectionStrings": { "DefaultConnection": "SQLServer用接続文字列", "MySQLConnection": "MySQL用接続文字列" }, "Authentication": { "Twitter": { "ConsumerKey": "ConsumerKey", "ConsumerSecret": "ConsumerSecret" } } }
私はsecrets.json
を直接エディタで編集しましたが公式ドキュメントには下記のコマンドで一括でset
するコマンドも記載がありました。
内容をパイプで渡してるだけですが...
dotnet user-secrets set
で一括設定する方法
$ cat ./input.json | dotnet user-secrets set
動作確認
こちらの公式ドキュメント内でStartup.cs
のコードを触る風に書いてますが私の環境ではコードを編集せずそのまま実行することが可能でした。
雑感
~/.microsoft/usersecrets/<UserSecretsId>/
ディレクトリが存在していなくて後回しにしていたんですが
Twitter APIのConsumerキーをいちいち書き換えるのが面倒すぎてgit commitをためらっていたのでやっと楽になりました...