はじめに
iOSアプリ開発において、APIアクセスキーの管理方法に疑問を持ちました。
iOSアプリ開発で、APIアクセスキーなどの機密情報を管理するベストプラクティスを実は知らない😢
— ウホーイ (@the_uhooi) January 11, 2020
privateリポジトリだとソースコードに直書きしてしまいがちなので、ちょっと調べてみよう
Twitterでいろいろ教えていただき、自分の中でベストプラクティスを考えたので紹介します。
結論
先に結論を記載します。
- CocoaPodsを使っている、かつライブラリの追加に抵抗がない → cocoapods-keysを導入する
- CocoaPodsを使っていない、またはライブラリの追加に抵抗がある
- リポジトリがprivate →
.swift
ファイルへ直接書く - リポジトリがpublic → CI時に
.swift
ファイルへ注入する
- リポジトリがprivate →
解説
結論のみではわからないので、解説します。
cocoapods-keys
CocoaPodsのプラグインで、機密情報をキーチェーンアクセスで管理するツールです。
https://github.com/orta/cocoapods-keys
私は使ったことがないのですが、 こちらの記事 を読む限り、非常に便利なツールです。
CocoaPodsを使っているなら、導入を検討してもよさそうです。
リポジトリがprivate
CocoaPodsを使っていない、またはライブラリの追加に抵抗がある場合は、手動で対応する方法が考えられます。
リポジトリがprivateの場合、 .swift
ファイルへ直接書いて問題ないと思います。
理由は当たり前ですが、privateリポジトリからソースが漏れることは(基本的に)ないためです。
let fooAccessToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // 直接書いてOK
注意点として、 .plist
ファイルなどのリソースに保持すると、エンドユーザーが読み取れてしまいます 。
.swift
ファイルはコンパイルされますが、リソースはそのまま .ipa
ファイル内に保持されます。
もしリソースで機密情報を管理していたら、すぐに対応すべきです。
リポジトリがpublic
APIアクセスキーを使っているOSSなど、リポジトリがpublicな場合も考えられます。
その場合はソースに直接書けないので、CI時に注入します。
①ローカルの .swift
ファイルにアクセスキーを記述する
privateリポジトリと同様、 .swift
ファイルをプロジェクト内に作成してアクセスキーを記述します。
let fooAccessToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
これでローカルでの開発は問題なく行えます。
②アクセスキーを含むファイルをGitの管理外にする
このままリモートリポジトリにプッシュすることはできないので、 .gitignore
に対象ファイルを追記します。
+ AccessTokens.swift
③プロジェクトファイルのみプッシュする
対象ファイルを追加したプロジェクトファイルのみリモートリポジトリにプッシュします。
④CIサービスにアクセスキーを保持する
ほとんどのCIサービスには機密情報を暗号化して保持する機能があると思うので、活用します。
GitHubの場合、 Secrets という機能があるので、そこでアクセスキーをシークレットとして保持します。
⑤CI時にアクセスキーを注入する
保持したアクセスキーをCI時に注入します。
GitHub Actionsの場合、以下のようなステップをビルド前に実行します。
- name: Inject access token
run: echo "let fooAccessToken = \"${{ secrets.FOO_ACCESS_TOKEN }}\"" > ./Foo/AccessTokens.swift
これでCI時にアクセスキーを .swift
ファイルへ注入できます。
⑥Makefileを用意する
自分以外の開発者のために、Makefileを用意すると親切です。
以下に例を記載します。
.PHONY: inject-tokens
inject-tokens:
echo "let fooAccessToken = \"${FOO_ACCESS_TOKEN}\"" > ./Foo/AccessTokens.swift
コマンドをREADMEに書くことで、他の人もローカルで開発しやすくなります。
Run `make inject-tokens FOO_ACCESS_TOKEN={Foo Access token}` .
おわりに
これでiOSアプリ開発で安全にAPIアクセスキーを管理できます!
もし他にベストプラクティスを持っている方がいたら、教えていただけると嬉しいです。