LoginSignup
141
86

More than 3 years have passed since last update.

iOSアプリ内にAPIアクセスキーを保持するベストプラクティス(Swift)

Last updated at Posted at 2020-01-17

はじめに

iOSアプリ開発において、APIアクセスキーの管理方法に疑問を持ちました。

Twitterでいろいろ教えていただき、自分の中でベストプラクティスを考えたので紹介します。

結論

先に結論を記載します。

  • CocoaPodsを使っている、かつライブラリの追加に抵抗がない → cocoapods-keysを導入する
  • CocoaPodsを使っていない、またはライブラリの追加に抵抗がある
    • リポジトリがprivate → .swift ファイルへ直接書く
    • リポジトリがpublic → CI時に .swift ファイルへ注入する

解説

結論のみではわからないので、解説します。

cocoapods-keys

CocoaPodsのプラグインで、機密情報をキーチェーンアクセスで管理するツールです。
https://github.com/orta/cocoapods-keys

私は使ったことがないのですが、 こちらの記事 を読む限り、非常に便利なツールです。
CocoaPodsを使っているなら、導入を検討してもよさそうです。

リポジトリがprivate

CocoaPodsを使っていない、またはライブラリの追加に抵抗がある場合は、手動で対応する方法が考えられます。

リポジトリがprivateの場合、 .swift ファイルへ直接書いて問題ないと思います。
理由は当たり前ですが、privateリポジトリからソースが漏れることは(基本的に)ないためです。

AccessTokens.swift
let fooAccessToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // 直接書いてOK

注意点として、 .plist ファイルなどのリソースに保持すると、エンドユーザーが読み取れてしまいます
.swift ファイルはコンパイルされますが、リソースはそのまま .ipa ファイル内に保持されます。
もしリソースで機密情報を管理していたら、すぐに対応すべきです。

リポジトリがpublic

APIアクセスキーを使っているOSSなど、リポジトリがpublicな場合も考えられます。
その場合はソースに直接書けないので、CI時に注入します。

①ローカルの .swift ファイルにアクセスキーを記述する

privateリポジトリと同様、 .swift ファイルをプロジェクト内に作成してアクセスキーを記述します。

AccessTokens.swift
let fooAccessToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

これでローカルでの開発は問題なく行えます。

②アクセスキーを含むファイルをGitの管理外にする

このままリモートリポジトリにプッシュすることはできないので、 .gitignore に対象ファイルを追記します。

.gitignore
+ AccessTokens.swift

③プロジェクトファイルのみプッシュする

対象ファイルを追加したプロジェクトファイルのみリモートリポジトリにプッシュします。

④CIサービスにアクセスキーを保持する

ほとんどのCIサービスには機密情報を暗号化して保持する機能があると思うので、活用します。
GitHubの場合、 Secrets という機能があるので、そこでアクセスキーをシークレットとして保持します。

スクリーンショット_2020-01-18_0_21_30.jpg

⑤CI時にアクセスキーを注入する

保持したアクセスキーをCI時に注入します。
GitHub Actionsの場合、以下のようなステップをビルド前に実行します。

main.yml
- name: Inject access token
  run: echo "let fooAccessToken = \"${{ secrets.FOO_ACCESS_TOKEN }}\"" > ./Foo/AccessTokens.swift

これでCI時にアクセスキーを .swift ファイルへ注入できます。

⑥Makefileを用意する

自分以外の開発者のために、Makefileを用意すると親切です。
以下に例を記載します。

Makefile
.PHONY: inject-tokens

inject-tokens:
    echo "let fooAccessToken = \"${FOO_ACCESS_TOKEN}\"" > ./Foo/AccessTokens.swift

コマンドをREADMEに書くことで、他の人もローカルで開発しやすくなります。

README.md
Run `make inject-tokens FOO_ACCESS_TOKEN={Foo Access token}` .

おわりに

これでiOSアプリ開発で安全にAPIアクセスキーを管理できます!

もし他にベストプラクティスを持っている方がいたら、教えていただけると嬉しいです。

参考リンク

141
86
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
141
86