SafetyNet reCAPTCHA API

SafetyNet サービスには、悪意のあるトラフィックからアプリを保護する reCAPTCHA API が含まれています。

reCAPTCHA は高度なリスク分析エンジンを使用して、スパムやその他の攻撃からアプリを保護する無料サービスです。このサービスは、アプリを操作しているのが人間ではなくボットであるという疑いがある場合に、アプリの実行を継続するにあたって人間が解答しなければならない CAPTCHA を提示します。

このドキュメントでは、SafetyNet の reCAPTCHA API をアプリに統合する方法について説明します。

追加利用規約

reCAPTCHA API にアクセスするか、これを使用すると、Google API 利用規約と、以下の reCAPTCHA 利用規約に同意したことになります。適用されるすべての利用規約とポリシーを確認し、理解したうえで API にアクセスしてください。

reCAPTCHA 利用規約

reCAPTCHA API がハードウェアやソフトウェアの情報(デバイスとアプリケーションのデータ、完全性判定の結果など)を収集し、分析のためにそのデータを Google に送信することにより機能することを理解し、了承するものとします。Google API 利用規約の第 3 条(d)に基づき、この API を利用するにあたり、自己責任において、これらのデータの収集および Google との共有に関して必要な通知を行い、ユーザーの同意を得ることに合意するものとします。

reCAPTCHA キーペアを登録する

SafetyNet reCAPTCHA API で使用するキーペアを登録するには、reCAPTCHA Android 登録サイトに移動してから、次の手順を実行します。

  1. 表示されたフォームに、次の情報を入力します。

    • ラベル: キーの一意のラベル。通常、会社や組織の名前を使用します。
    • reCAPTCHA のタイプ: [reCAPTCHA v2] をクリックして、[reCAPTCHA Android] を選択します。
    • パッケージ: この API キーを使用する各アプリのパッケージ名を指定します。アプリで API を使用するには、入力したパッケージ名がアプリのパッケージ名と完全に一致する必要があります。パッケージ名は 1 行に 1 つずつ入力します。
    • オーナー: アプリの reCAPTCHA 評価をモニタリングする組織内の各ユーザーのメールアドレスを追加します。
  2. [reCAPTCHA 利用条件に同意する] チェックボックスをオンにします。

  3. アラートをオーナーに送信する: reCAPTCHA API に関するメールを受信する場合は、このチェックボックスをオンにして、[送信] をクリックします。

  4. 次に表示されるページで、公開鍵と秘密鍵がそれぞれ [サイトキー] と [秘密鍵] に表示されます。サイトキーは検証リクエストを送信するときに使用し、秘密鍵はユーザー応答トークンを検証するときに使用します。

SafetyNet API の依存関係を追加する

reCAPTCHA API を使用する前に、SafetyNet API をプロジェクトに追加します。Android Studio を使用している場合は、アプリレベルの Gradle ファイルにこの依存関係を追加します。詳しくは、SafetyNet API の設定をご覧ください。

reCAPTCHA API を使用する

このセクションでは、reCAPTCHA API を呼び出して CAPTCHA 検証リクエストを送信し、ユーザー応答トークンを受信する方法について説明します。

検証リクエストを送信する

SafetyNet reCAPTCHA API を呼び出すには、verifyWithRecaptcha() メソッドを呼び出します。通常、このメソッドはアクティビティ内のボタンなどの UI 要素のユーザーによる選択に対応しています。

アプリで verifyWithRecaptcha() メソッドを使用する場合は、以下を行う必要があります。

  • API サイトキーをパラメータとして渡します。
  • onSuccess() メソッドと onFailure() メソッドをオーバーライドして、検証リクエスト タスクの結果(成功または失敗)を両方とも処理します。特に、API が onFailure()ApiException のインスタンスを渡した場合、getStatusCode(). で取得できる各ステータス コードを処理する必要があります。

このメソッドを呼び出す方法を次のコード スニペットに示します。

Kotlin

fun onClick(view: View) {
    SafetyNet.getClient(this).verifyWithRecaptcha(YOUR_API_SITE_KEY)
            .addOnSuccessListener(this as Executor, OnSuccessListener { response ->
                // Indicates communication with reCAPTCHA service was
                // successful.
                val userResponseToken = response.tokenResult
                if (response.tokenResult?.isNotEmpty() == true) {
                    // Validate the user response token using the
                    // reCAPTCHA siteverify API.
                }
            })
            .addOnFailureListener(this as Executor, OnFailureListener { e ->
                if (e is ApiException) {
                    // An error occurred when communicating with the
                    // reCAPTCHA service. Refer to the status code to
                    // handle the error appropriately.
                    Log.d(TAG, "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}")
                } else {
                    // A different, unknown type of error occurred.
                    Log.d(TAG, "Error: ${e.message}")
                }
            })
}

Java

public void onClick(View v) {
    SafetyNet.getClient(this).verifyWithRecaptcha(YOUR_API_SITE_KEY)
        .addOnSuccessListener((Executor) this,
            new OnSuccessListener<SafetyNetApi.RecaptchaTokenResponse>() {
                @Override
                public void onSuccess(SafetyNetApi.RecaptchaTokenResponse response) {
                    // Indicates communication with reCAPTCHA service was
                    // successful.
                    String userResponseToken = response.getTokenResult();
                    if (!userResponseToken.isEmpty()) {
                        // Validate the user response token using the
                        // reCAPTCHA siteverify API.
                    }
                }
        })
        .addOnFailureListener((Executor) this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    if (e instanceof ApiException) {
                        // An error occurred when communicating with the
                        // reCAPTCHA service. Refer to the status code to
                        // handle the error appropriately.
                        ApiException apiException = (ApiException) e;
                        int statusCode = apiException.getStatusCode();
                        Log.d(TAG, "Error: " + CommonStatusCodes
                                .getStatusCodeString(statusCode));
                    } else {
                        // A different, unknown type of error occurred.
                        Log.d(TAG, "Error: " + e.getMessage());
                    }
                }
        });
}

ユーザー応答トークンを検証する

ユーザーが CAPTCHA チャレンジに成功すると、reCAPTCHA API は onSuccess() メソッドを実行します。ただし、このメソッドは、ユーザーが CAPTCHA に正しく答えたことを示しているにすぎません。次に、バックエンド サーバーからのユーザーの応答トークンを検証する必要があります。

ユーザーの応答トークンを検証する方法については、ユーザーの応答を検証するをご覧ください。