Xamarin.iOSでキーチェーンにパスワードなどの重要情報を保存する方法


はじめに

Xamarin.iOS で iPhone アプリなどを作成する際、キーチェーンにパスワードなどの重要情報を保存するのは、Xamarin.Auth という NuGet パッケージを使用すれば割合簡単に行うことができます。

ですが、キーチェーンにアクセスする際には Visual Studio for Mac で設定が必要です。

まずは、その設定から行いましょう。

Entitlements.plist の設定

キーチェーンにアクセスするためには、まず Entitlements.plist で「キーチェーンを有効にする」にチェックを入れる必要があります。

f:id:fnyablog:20180913215541p:plain

プロビジョニングの設定がうまく行っていれば、キーチェーングループも表示されるはずですが、もし表示されない場合は以下の記事を参考にしてみてください。

そして、プロジェクトのオプションで、「カスタムエンタイトルメント」に「Entitlements.plist 」を設定します。

f:id:fnyablog:20180913215850p:plain

Xamarin.Auth のインストール

Xamarin.Auth を NuGet でインストールします。

これで準備は終了です。

実際の実装を見ていきましょう。

キーチェーンへの保存と読み込みに必要な定義

キーチェーンへの保存と読み込みでは、共通で以下の名前空間の使用を宣言しておきます。

System.Diagnosticsはデバッグ用なので本番ソースコードでは削除した方がよいですが。

using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;

キーチェーンにパスワードを保存する

キーチェーンにパスワードを保存する方法は以下の通りです。Xamarin.Auth のおかげですが簡単ですね。

//パスワードをキーチェーンに保存する
var prop = new Dictionary<string, string>();

prop["password"] = "password";

var account = new Xamarin.Auth.Account("userName", prop);

var store = Xamarin.Auth.AccountStore.Create();

store.Save(account, "serviceId");

キーチェーンからパスワード読み込む

キーチェーンからパスワードを読み込む方法は以下の通りです。デバッグで取得したパスワードを出力しています。

//キーチェーンからパスワードを取り出す
var store = Xamarin.Auth.AccountStore.Create();

var account = store.FindAccountsForService("serviceId")
    .SingleOrDefault();

var password = account.Properties["password"];

Debug.WriteLine(password);

おわりに

設定が正しくできていれば、Xamarin.Auth のおかげでかなり簡単にキーチェーンにパスワードなどの重要情報を保存できますね。

パスワードなどは暗号化したとしても暗号キーをどこに持つかという問題があります。

それをキーチェーンは解決してくれる訳ですね。