このページでは、reCAPTCHA Enterprise を Android アプリに統合する方法について説明します。
不審なトラフィックに視覚的なチャレンジを提供する場合は、SafetyNet reCAPTCHA API を使用できます。
準備
Android アプリ プラットフォーム用の reCAPTCHA キーを作成します。
別の方法としては、次のいずれかの方法で、Android の既存の reCAPTCHA キーの ID をコピーできます。
Google Cloud コンソールから既存のチェックボックスのキーの ID をコピーするには、次の操作を行います。
[reCAPTCHA Enterprise] ページに移動します。
- reCAPTCHA キーのリストで、コピーするキーの上にポインタを置き、[ ] をクリックします。
- REST API を使用して既存の鍵の ID をコピーするには、projects.keys.list メソッドを使用します。
- gcloud CLI を使用して既存の鍵の ID をコピーするには、gcloud recaptcha keys list コマンドを使用します。
Android 環境を準備する
ネイティブ Android
Android Studio の最新バージョンをダウンロードおよびインストールし、開発環境を準備します。
Android SDK の最小値が API 19: Android 4.4(KitKat)に設定されているアプリがあることを確認します。アプリの最小 SDK を API 19 に設定するか、新しいモバイルアプリを作成できます。
新しいモバイルアプリを作成する場合は、新しい Android Studio プロジェクトを開始してテスト アプリを作成します。
- [Empty Activity] を選択します。アプリで Jetpack Compose を使用する場合は、[Empty Compose Activity] を選択します。
- 言語を kotlin に設定します。
- SDK の最小値を API 19: Android 4.4(KitKat)に設定します。
次のスニペットに示すように、Google の Maven リポジトリ
google()
がプロジェクト レベルのbuild.gradle
ファイル内のリポジトリのリストにあることを確認します。allprojects { repositories { google() } }
詳細については、Google の Maven リポジトリをご覧ください。
reCAPTCHA Enterprise API の依存関係を追加するには、アプリレベルの
build.gradle
ファイルのdependencies
セクションに次のビルドルールを追加します。implementation 'com.google.android.recaptcha:recaptcha:18.5.0-beta03'
Android アプリで依存関係を追加する方法については、ビルド依存関係を追加するをご覧ください。
アプリのマニフェストで、最初の
<manifest>
タグと最初の<application>
タグの間にインターネットの権限を追加します(例:AndroidManifest.xml
)。reCAPTCHA Enterprise API にはネットワーク オペレーションが含まれているため、この権限が必要です。<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <application ...> ... </application> </manifest>
新しいプロジェクトで
AndroidX
ライブラリを使用する場合は、SDK を Android 9.0 以降にコンパイルし、次のコード スニペットをgradle.properties
に追加します。android.useAndroidX=true android.enableJetifier=true
詳細については、AndroidX への移行をご覧ください。
Flutter
Flutter で reCAPTCHA Enterprise を使用する方法については、Flutter のドキュメントをご覧ください。
ReactNative
React Native を使用した reCAPTCHA Enterprise の使用方法については、React Native のドキュメントをご覧ください。
reCAPTCHA Enterprise と Android アプリの統合
Android アプリ用に作成した reCAPTCHA キー(KEY_ID)を使用して、クライアントをインスタンス化します。
Kotlin
class MainActivity : AppCompatActivity() { private lateinit var recaptchaClient: RecaptchaClient override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initializeRecaptchaClient() // ... rest of onCreate code } private fun initializeRecaptchaClient() { lifecycleScope.launch { Recaptcha.getClient(application, "KEY_ID") .onSuccess { client -> recaptchaClient = client } .onFailure { exception -> // Handle communication errors ... // See "Handle communication errors" section } } } // ... rest of activity code. }
Java
public final class MainActivity extends Activity { @Nullable private RecaptchaTasksClient recaptchaTasksClient = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initializeRecaptchaClient(); // ... rest of onCreate code } private void initializeRecaptchaClient() { Recaptcha .getTasksClient(getApplication(), "KEY_ID") .addOnSuccessListener( this, new OnSuccessListener<RecaptchaTasksClient>() { @Override public void onSuccess(RecaptchaTasksClient client) { MainActivity.this.recaptchaTasksClient = client; } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle communication errors ... // See "Handle communication errors" section } }); } // ... rest of activity code. }
reCAPTCHA Enterprise を使用して保護されているアプリのアクションごとに、RecaptchaAction を渡して
execute
メソッドを呼び出します。reCAPTCHA Enterprise には組み込みのアクションセットが用意されており、必要に応じてカスタムアクションを作成できます。次のコード スニペットは、
execute
を使用してLOGIN
アクションを保護する方法を示しています。Kotlin
private fun executeLoginAction() { lifecycleScope.launch { recaptchaClient .execute(RecaptchaAction.LOGIN) .onSuccess { token -> // Handle success ... // See "What's next" section for instructions // about handling tokens. } .onFailure { exception -> // Handle communication errors ... // See "Handle communication errors" section } } }
Java
private void executeLoginAction(View v) { assert recaptchaTasksClient != null; recaptchaTasksClient .executeTask(RecaptchaAction.LOGIN) .addOnSuccessListener( this, new OnSuccessListener<String>() { @Override public void onSuccess(String token) { // Handle success ... // See "What's next" section for instructions // about handling tokens. } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle communication errors ... // See "Handle communication errors" section } }); }
次のサンプルコード スニペットは、1 つのアクティビティ アプリでの getClient()
と execute()
メソッドの完全な統合を示しています。
Kotlin
class MainActivity : AppCompatActivity() {
private lateinit var recaptchaClient: RecaptchaClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initializeRecaptchaClient()
findViewById<View>(R.id.btn_login).setOnClickListener { executeLoginAction() }
findViewById<View>(R.id.btn_redeem).setOnClickListener { executeRedeemAction() }
}
private fun initializeRecaptchaClient() {
lifecycleScope.launch {
Recaptcha.getClient(application, "KEY_ID")
.onSuccess { client ->
recaptchaClient = client
}
.onFailure { exception ->
// Handle communication errors ...
// See "Handle communication errors" section
}
}
}
private fun executeLoginAction() {
lifecycleScope.launch {
recaptchaClient
.execute(RecaptchaAction.LOGIN)
.onSuccess { token ->
// Handle success ...
// See "What's next" section for instructions
// about handling tokens.
}
.onFailure { exception ->
// Handle communication errors ...
// See "Handle communication errors" section
}
}
}
private fun executeRedeemAction(){
lifecycleScope.launch {
recaptchaClient
.execute(RecaptchaAction.custom("redeem"))
.onSuccess { token ->
// Handle success ...
// See "What's next" section for instructions
// about handling tokens.
}
.onFailure { exception ->
// Handle communication errors ...
// See "Handle communication errors" section
}
}
}
}
Java
public final class MainActivity extends Activity {
@Nullable private RecaptchaTasksClient recaptchaTasksClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initializeRecaptchaClient();
findViewById(R.id.btn_login).setOnClickListener(this::executeLoginAction);
findViewById(R.id.btn_redeem).setOnClickListener(this::executeRedeemAction);
}
private void initializeRecaptchaClient() {
Recaptcha
.getTasksClient(getApplication(), "KEY_ID")
.addOnSuccessListener(
this,
new OnSuccessListener<RecaptchaTasksClient>() {
@Override
public void onSuccess(RecaptchaTasksClient client) {
MainActivity.this.recaptchaTasksClient = client;
}
})
.addOnFailureListener(
this,
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle communication errors ...
// See "Handle communication errors" section
}
});
}
private void executeLoginAction(View v) {
assert recaptchaTasksClient != null;
recaptchaTasksClient
.executeTask(RecaptchaAction.LOGIN)
.addOnSuccessListener(
this,
new OnSuccessListener<String>() {
@Override
public void onSuccess(String token) {
// Handle success ...
// See "What's next" section for instructions
// about handling tokens.
}
})
.addOnFailureListener(
this,
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle communication errors ...
// See "Handle communication errors" section
}
});
}
private void executeRedeemAction(View v) {
assert recaptchaTasksClient != null;
recaptchaTasksClient
.executeTask(RecaptchaAction.custom("redeem"))
.addOnSuccessListener(
this,
new OnSuccessListener<String>() {
@Override
public void onSuccess(String token) {
// Handle success ...
// See "What's next" section for instructions
// about handling tokens.
}
})
.addOnFailureListener(
this,
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle communication errors ...
// See "Handle communication errors" section
}
});
}
}
API 呼び出しのタイムアウトを設定する
getClient
API と execute
API のタイムアウト値を指定するには、各 API の timeout
プロパティを使用します。
getClient
API のデフォルトのタイムアウトは 10 秒、execute
API のデフォルトのタイムアウトは 10 秒です。
Kotlin
getClient
を呼び出すときのタイムアウトを設定します。lifecycleScope.launch { Recaptcha.getClient(application, "KEY_ID", timeout = 20000L) .onSuccess { client -> recaptchaClient = client } .onFailure { exception -> // Handle communication errors ... // See "Handle communication errors" section } }
このコード スニペットでは、
getClient
のタイムアウトを 20 秒に設定します。execute
を呼び出すときのタイムアウトを設定します。lifecycleScope.launch { recaptchaClient .execute(RecaptchaAction.LOGIN(), timeout = 10000L) .onSuccess { token -> // Handle success ... // See "What's next" section for instructions // about handling tokens. } .onFailure { exception -> // Handle communication errors ... // See "Handle communication errors" section } }
このコード スニペットでは、
execute
のタイムアウトを 10 秒に設定します。
Java
getClient
を呼び出すときのタイムアウトを設定します。Recaptcha .getTasksClient(getApplication(), "KEY_ID", 20000L) .addOnSuccessListener( this, new OnSuccessListener<RecaptchaTasksClient>() { @Override public void onSuccess(RecaptchaTasksClient client) { MainActivity.this.recaptchaTasksClient = client; } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle communication errors ... // See "Handle communication errors" section } });
このコード スニペットでは、
getClient
のタイムアウトを 20 秒に設定します。execute
を呼び出すときのタイムアウトを設定します。recaptchaTasksClient .executeTask(RecaptchaAction.custom("redeem"), 10000L) .addOnSuccessListener( this, new OnSuccessListener<String>() { @Override public void onSuccess(String token) { // Handle success ... // See "What's next" section for instructions // about handling tokens. } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle communication errors ... // See "Handle communication errors" section } });
このコード スニペットでは、
execute
のタイムアウトを 10 秒に設定します。
通信エラーを処理する
アプリが reCAPTCHA サービスと通信できない場合は、API でエラーが発生したことが原因の可能性があります。このようなエラーを適切に処理するロジックをアプリに追加する必要があります。
一般的な API エラーの軽減の詳細については、RecaptchaErrorCode をご覧ください。
API リファレンス
Android 用 reCAPTCHA API の完全なリファレンスについては、com.google.android.recaptcha
をご覧ください。
次のステップ
reCAPTCHA レスポンストークンを評価するため、評価を作成する。