DeployGateを使って特定の端末やユーザー以外では起動できないアプリを作る(Kotlin編)


アプリを起動できる端末を制御したい

公開前のアプリや開発中のバージョンのアプリ、社外秘や業務用のアプリなどを、特定のユーザーや、特定の管理している端末以外ではそもそも起動されたくない、起動されては困るという場合がしばしばあります。

特にAndroidの場合はアプリの実行バイナリであるAPKファイルを端末から容易にぶっこ抜けるということもあり、アプリの配布やインストールを管理したり制御しても、悪意を持ってAPKファイルを抜かれてしまうと再配布や流出させてしまうことが簡単にできてしまいます。また、未公開のアプリがインストールされた端末を紛失してしまったり、開発メンバーが退職したり、個人の端末でテストを行ってもらったあとに確実にテスト版のアプリを削除してもらいたい場合も、そもそもアプリの起動権限を遠隔から剥奪することができればさらに安心です。

このようなアプリの起動権限の遠隔制御は、DeployGate SDKが提供しているユーザ認証機能を使用すると、簡単に実現することができます。

ここでは実際に、Kotlinを使って特定のDeployGateユーザのAndroid端末でしか起動することが出来ないアプリを作ってみようと思います。

DeployGate SDK の導入

DeployGateはアプリを特定の人だけに配布するための開発用配信サービスです。配布対象の制御だけであればSDKのインストールは不要でAPKファイルをアップロードするだけで使用できますが、提供するSDKを導入すると、今回使用するユーザ認証機能に加えて、リモートでのログ収集をはじめとした様々な便利機能を利用することができます。

DeployGate SDKの導入はGradleから行います。

AndroidStudioのプロジェクトビューからbuild.gradleを選択し、depensenciesの項目に以下の行を追加します。

    compile 'com.deploygate:sdk:4.0.0'

ファイルを編集後、エディタ上部に表示される案内に従ってSync Nowを押して変更を反映させます。SDKの導入はこれだけで完了です!

アプリの起動権限制御を実装

次に、DeployGate SDKの提供するユーザ認証機能を使い、アプリの起動時に起動権限を確認し、もしDeployGateでのアクセス権限の無いアプリ(= 起動権限の無いアプリ)だった場合にアクティビティを強制終了するコードを実装します。といっても、アクティビティのonCreate内のsuper.onCreate(savedInstanceState)の後に以下のように確認処理を書き足すだけです。
(MainActivityの名称は適切に読み替えてください)


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        //DeployGateによる起動権限の確認
        DeployGate.registerCallback(object: DeployGateCallback{
            override fun onStatusChanged(isManaged: Boolean, isAuthorized: Boolean, loginUsername: String?, isStopped: Boolean) {
                if(!isAuthorized){
                    Toast.makeText(this@MainActivity, "You are not authorized to launch this app", Toast.LENGTH_LONG).show()
                    finish()
                }
            }
            override fun onUpdateAvailable(revision: Int, versionName: String?, versionCode: Int) {}
            override fun onInitialized(isServiceAvailable: Boolean) {}
        }, true)


        setContentView(R.layout.activity_main)
    }
}

これで、もし起動権限のない人がアプリを立ち上げてアクティビティを起動しようとした場合、Toastにエラーを表示して自身のアクティビティを強制終了させることができます。

アプリ立ち上げてみよう

それでは実際にアプリを立ち上げてみたいと思います。DeployGateのクライアントがインストールされていなかったり、ログインをしていなかったり、自分のアクセス権が無いアプリだった場合は場合は、Toastで「You are not authorized to launch this app」とエラーが表示されActivityを起動することができません。

DeployGateクライアントをインストールしてログインした状態で、アクセス権限のあるアプリを起動した場合は、通常通りアクティビティが起動します。

なお、アプリ(アクティビティ)起動中や起動後であっても、その間にDeployGateクライアントからログアウトする操作を行ったり、遠隔で端末からDeployGateクライアントログアウトさせたりした場合は、そのイベントを検知してすぐにアクティビティが強制終了します。

また、ユーザー認証はDeployGateで管理されているバージョンのアプリのみに対して有効なので、同じパッケージ名であっても、変更後にUSBケーブルなどから上書き転送したものは起動する事ができません。具体的には、アプリのパッケージ名とタイムスタンプ、md5を元に判定されます。

デバックを容易にするために、プラグイン経由で毎回DeployGateにアップロードするか、特定のproductFlavor(BUILD_TYPE)だけ認証を有効にするなど工夫すると良いでしょう。

// 例
if (BuildConfig.BUILD_TYPE == "stagingDebug") {
    DeployGate.registerCallback(...)
}

テスターやグループのメンバーの起動権限を剥奪する

ユーザ認証機能はDeployGate上のアプリへのアクセス権限に基づいて機能します。起動権限を外したい場合は、DeployGateで管理しているアプリにアクセスできるメンバーから対象ユーザー外してください。

インストールされている端末の起動権限を遠隔から剥奪する

自アカウントが保有する特定の端末からの起動権限を剥奪する場合は、自分のアカウントに紐づく端末の登録を削除します。DeployGateのダッシュボードの左サイドバーの最下部にある「利用中の端末」かた起動権限を剥奪したい端末を選び「リモートでログアウトさせる」を選んで、遠隔から対象端末のDeployGateクライアントをログアウトさせてください。

まとめ

DeployGateとDeployGate SDKをつかって特定のアカウントや端末でしか起動できないアプリをKotlinで作る方法をご紹介しました。起動権限を確認するフローを簡単に入れておくだけで、配布後も流出リスクを抑えた安心でストレスフリーな開発を行うことができます。ぜひお試しください!