shuhelohelo’s blog

Xamarin.Forms多めです.

機密情報をUserSecretに移して安全に:実践編

shuhelohelo.hatenablog.com

接続文字列やAPIキーなどの機密情報はソースコードの中に含まないし,Gitなどの管理下に含まれないようにする方法として,ローカルにおいてはUserSecretを使うとよい,という内容を書いた↑.

ちょうど,以下の記事でGoogleを使った外部認証について書いたけれど,ClientIdとClientSecretをソースコード内にハードコーディングしているので,当然これではいけないし,GitHubで公開もできない.

shuhelohelo.hatenablog.com

お誂え向きということで,UserSecretにClientIdとClientSecretの2つを設定して,ソースコードに機密情報が含まれないようにする.

手順

すでにOpen UserSecrets拡張をインストールしてあるとする.

secrets.jsonに機密情報を書く

プロジェクトを右クリックしてコンテキストメニューからOpen UserSecretsを選択してsecrets.jsonを開く.

f:id:shuhelohelo:20191229005918p:plain

secrets.jsonに以下のようにGoogle認証に必要な情報を書いておきます.

{
    "ExternalAuth":{
        "Google":{
            "ClientId":"xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
            "ClientSecret":"YYYYYYYYYYYYYYYY"
        }
    }
}

コマンドラインから確認してみたり.

> dotnet user-secrets list
ExternalAuth:Google:ClientSecret = YYYYYYYYYYYYYYYY
ExternalAuth:Google:ClientId = xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
OAuthPractice

ちゃんと登録されているようです.

UserSecretから情報を取得

Startup.cs内のConfigureServicesメソッドで,これまではClientIdとClientSecretを直接ハードコーディングしていましたが,ここでConfiguration経由でsecrets.jsonから情報を取得します.

            services.AddAuthentication()
                .AddGoogle(options =>
                {
                    options.ClientId = this.Configuration["ExternalAuth:Google:ClientId"];
                    options.ClientSecret = this.Configuration["ExternalAuth:Google:ClientSecret"];       
                });

Configurationから値を取得するキーとしてJSONの階層構造をフラット化した文字列を指定します.

動かす

それでは実行しましょう.

f:id:shuhelohelo:20191229012944p:plain

ボタンを押すと,Googleの認証画面が表示されました.

f:id:shuhelohelo:20191229012504p:plain

無事に機密情報をプロジェクトの外に出すことができました.

これでGitHubにプッシュすることができます.

今回のソースコードはこちら

github.com