lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

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での追加方法はこちらの公式ブログで解説されています。)

目次

環境

  • MacOS Mojave Version 10.14.3
  • .Net Core SDK Version 2.2.104

参考サイト様

docs.microsoft.com

前提

  • ASP.NET Core MVCテンプレートの個人認証(Identity)付きプロジェクト
$ dotnet new mvc -n hoge -au Individual

テンプレートから作成されたプロジェクトなので今回は問題ないが素で作成しているのであれば下記パッケージの追加が必要

現状

Twitter認証部分のコードです。公式ドキュメントのサンプルコードとほぼ変わりません。
今回はConnectionStringsAuthentication部分を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をためらっていたのでやっと楽になりました...