このドキュメントでは、reCAPTCHA のアカウント保護機能を使用して、モバイルアプリでのアカウント関連の不正行為を検出して防止する方法について説明します。
reCAPTCHA は、ログインや購入手続きなど、重要なアクションの保護に役立ちます。ただし、巧妙なアカウントの不正使用は多く、これはモバイルアプリで特定のユーザーの行動を一定期間モニタリングすることで検出できます。reCAPTCHA アカウント保護機能は、モバイルアプリに対してサイト固有のモデルを作成し、不審な動作の傾向やアクティビティの変化を検出することで、この種の巧妙な不正行為を識別に役立ちます。サイト固有のモデルを使用すると、reCAPTCHA のアカウント保護機能によって次に挙げることの検出が容易になります。
- 不審なアクティビティ
- 類似した動作のアカウント
- 特定のユーザーに対して信頼できるとマークされたデバイスからのリクエスト
reCAPTCHA のアカウント保護機能とサイト固有のモデルの分析に基づいて、次のことを行えます。
- 不正なアカウントを制限または無効にする。
- アカウントの乗っ取りの試みを防ぐ。
- 正常なアカウントの乗っ取りを軽減する。
- 正当なユーザー アカウントからのリクエストにのみアクセスを許可する。
- 信頼できるデバイスからのユーザー ログインをスムーズにする。
始める前に
- モバイルアプリ用の reCAPTCHA アカウント保護には、プロジェクトに請求先アカウントを追加して自動セキュリティ審査をトリガーした後にアクセスできます。 この機能をサイトにオンボーディングするには、プロジェクトに請求先アカウントを追加します。
- reCAPTCHA 用に環境を準備します。
- スコアベース キーを作成します。
reCAPTCHA のアカウント保護用にモバイルアプリを構成する
reCAPTCHA のアカウント保護機能では、効果的な検出を可能にするために、アカウント アクティビティを包括的に理解する必要があります。アカウント関連のアクティビティを reCAPTCHA のアカウント保護機能にフィードし、サイト固有のモデルを作成して改善するには、次の手順を行います。
- reCAPTCHA とモバイルアプリを統合します。 - Android アプリの場合は、reCAPTCHA を Android アプリに統合するをご覧ください。
- iOS アプリについては、reCAPTCHA を iOS アプリに統合するをご覧ください。
 
- 重要なユーザー アクションに関するレポートを行う。
- 重要なユーザー イベントを評価する。
- ユーザー イベントにアノテーションを付け、サイト固有のモデルを調整する。
重要なユーザー アクションに関するレポートを行う
不審なアクティビティのパターンを検出し、サイトの一般的なアクティビティ パターンをより深く理解するには、reCAPTCHA のアカウント保護で重要なユーザー アクションに関する情報が必要です。reCAPTCHA を使用して保護されているアプリのアクションごとに、RecaptchaAction を指定して execute() メソッドを呼び出します。execute() と RecaptchaAction の詳細については、以下をご覧ください。
- Android: execute()とRecaptchaAction。
- iOS: execute()とRecaptchaAction。
reCAPTCHA には組み込みのアクションセットが用意されており、必要に応じてカスタムアクションを作成できます。
次の表に、重要なユーザー アクションをレポートする際に使用できるアクション名を示します。
| アクション名 | ユーザーが開始したイベントまたはユーザー アクション | 
|---|---|
| LOGIN | モバイルアプリにログインします。 | 
| SIGNUP | モバイルアプリで登録します。 | 
重要なユーザー イベントを評価する
ユーザー アクションで execute() を呼び出すと、トークンが生成されます。ログインの成功 / 失敗、登録、ログインしているユーザーのアクションなどの重要なユーザー イベントについては、execute() 呼び出しの結果を診断する評価を作成します。この評価によって、起こり得る不正行為の処理方法を決定する際の基準となるリスク判定が得られます。実行できるアクションには、不審なリクエストのブロック、リスクの高いログインへの疑い、関心のあるアカウントの調査などがあります。
reCAPTCHA のアカウント保護機能では、ユーザー アクティビティ(ログイン リクエスト、ログイン済みリクエスト、登録リクエストなど)を特定のアカウントに関連付けるために、安定したアカウント ID を指定する必要があります。これにより、reCAPTCHA のアカウント保護機能では、ユーザー アクティビティ パターンを理解し、アカウントごとにアクティビティ モデルを構築して、異常なトラフィックや不正なトラフィックをより適切に検出できます。
ユーザーが頻繁に変更しない固定のアカウント ID accountId を選択し、
projects.assessments.create メソッドで評価を指定します。この固定アカウント ID は、同じユーザーに関連するすべてのイベントで同じ値にする必要があります。アカウント ID として、以下を指定できます。
ユーザー識別子
すべてのアカウントを、固定のユーザー名、メールアドレス、電話番号に一意に関連付けることができる場合は、accountId として使用できます。このようなクロスサイト ID(サイト間で再利用できる ID)を指定すると、reCAPTCHA はこの情報を使用して、不正なアカウント ID にフラグを立て、こうした識別子に関連するクロスサイト不正行為のパターンに関する知識を活用することで、クロスサイト モデルに基づいてユーザー アカウントの保護を強化します。
あるいは、各アカウントに一意に関連付けられた内部ユーザー ID がある場合は、それを accountId として指定できます。
ハッシュ化と暗号化
各アカウントに一意に関連付けられた内部ユーザー ID がない場合は、安定した識別子を不透明なサイト固有のアカウント識別子にできます。この識別子は、reCAPTCHA のアカウント保護機能がユーザー アクティビティ パターンを把握して異常な動作を検出するために引き続き必要ですが、他のサイトと共有されることはありません。
任意の固定アカウント ID を選び、暗号化またはハッシュ化を使用して、reCAPTCHA に送信する前に不透明化します。
- 暗号化(推奨):安定した暗号テキストを生成する決定的な暗号化方法を使用して、アカウント ID を暗号化します。詳細な手順については、データを確定的に暗号化するをご覧ください。ハッシュ化ではなく対称暗号化を選択した場合、ユーザー ID と対応する不透明なユーザー ID とのマッピングを維持する必要はありません。reCAPTCHA から返される不透明な ID を復号して、ユーザー ID に変換します。 
- ハッシュ化: SHA256-HMAC メソッドを使用して、任意のカスタム ソルトでアカウント ID をハッシュ化することをおすすめします。ハッシュは一方向のため、生成されたハッシュとユーザー ID の間のマッピングを維持する必要があります。これにより、元のアカウントに返されるハッシュ化されたアカウント ID をマッピングできます。 
アカウント関連のすべてのリクエストに安定したアカウント ID を提供するだけでなく、一部の特定のリクエストには変更できない可能性のある追加アカウント ID を指定できます。accountId に加えて提供されるコンテキスト固有のアカウント ID は、reCAPTCHA のアカウント保護機能がユーザー アクティビティをより深く理解し、ユーザー アカウントを安全に保つためのアカウントの乗っ取りの試みを検出するのに役立ちます。追加の ID を指定すると、reCAPTCHA はこの情報を使用して、不正なアカウント ID にフラグを立て、これらの識別子に関連するクロスサイトへの不正行為パターンの知識を活用することで、クロスサイト モデルに基づいてユーザー アカウントの保護を強化します。たとえば、次の情報を提供できます。
- ログイン リクエストのログイン ハンドルとして使用されたユーザー名、メールアドレス、電話番号 
- 多要素認証リクエスト用の確認済みのメールアドレスまたは電話番号 
- アカウントの更新リクエスト時にユーザーから提供されたメールアドレスまたは電話番号(メインまたはサブ) 
- 登録リクエスト時にユーザーから提供されたメールアドレスと電話番号 
選択した安定したアカウント ID を、アカウント関連のすべてのリクエストの 
  projects.assessments.create メソッドの accountId パラメータに追加します。必要に応じて、評価の userIds フィールドを使用して、関連するリクエストの追加のアカウント ID を指定します。
リクエストのデータを使用する前に、次のように置き換えます。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID
- TOKEN: execute()呼び出しから返されたトークン
- KEY_ID: アプリに関連付けられた reCAPTCHA キー
- ACCOUNT_ID: ユーザー アカウントとアプリの関連付けのためにユーザー アカウントに一意に関連付けられた識別子
- EMAIL_ADDRESS: 省略可。このリクエストに関連付けられているメールアドレス(該当する場合)
- PHONE_NUMBER: 省略可。このリクエストに関連付けられている電話番号(該当する場合)
- USERNAME: 省略可。このリクエストに関連付けられているユーザー名(該当する場合)
HTTP メソッドと URL:
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments
リクエストの本文(JSON):
{
  "event": {
    "token": "TOKEN",
    "siteKey": "KEY_ID",
    "userInfo": {
      "accountId": "ACCOUNT_ID",
      "userIds": [
        {
          "email": "EMAIL_ADDRESS"
        },
        {
          "phoneNumber": "PHONE_NUMBER"
        },
        {
          "username": "USERNAME"
        }
      ]
    }
  }
}
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
      リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments"
PowerShell
      リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments" | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{
  "tokenProperties": {
    "valid": true,
    "androidPackageName": "com.example.app" or "iosBundleId": "com.example.app",
    "action": "login",
    "createTime": "2019-03-28T12:24:17.894Z"
  },
  "riskAnalysis": {
    "score": 0.6,
  },
  "event": {
    "token": "TOKEN",
    "siteKey": "KEY",
    "userInfo": {
      "accountId": "ACCOUNT_ID"
    }
  },
  "name": "projects/PROJECT_NUMBER/assessments/b6ac310000000000",
  "accountDefenderAssessment": {
    "labels": ["SUSPICIOUS_LOGIN_ACTIVITY"]
  }
}
コードサンプル
Java
reCAPTCHA に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
重要なユーザー イベントのリスク判定を解釈する
アカウント保護を有効にして評価を作成すると、アカウント保護は評価レスポンスの一部として accountDefenderAssessment を返します。accountDefenderAssessment の値は、ユーザーのアクションが正当か不正かを判断するのに役立ちます。また、ユーザー イベントにアノテーションを付ける際に使用する必要がある評価 ID も返します。
次の例は、JSON レスポンスのサンプルです。
{ "tokenProperties": { "valid": true, "androidPackageName": "com.example.app" or "iosBundleId": "com.example.app", "action": "login", "createTime": "2019-03-28T12:24:17.894Z" }, "riskAnalysis": { "score": 0.6, }, "event": { "token": "TOKEN", "siteKey": "KEY_ID", "expectedAction": "USER_ACTION" }, "name": "projects/PROJECT_ID/assessments/b6ac310000000000X", "accountDefenderAssessment": { labels: ["SUSPICIOUS_LOGIN_ACTIVITY"] } }
accountDefenderAssessment フィールドは次のいずれかの値になります。
| 値 | 説明 | 
|---|---|
| SUSPICIOUS_LOGIN_ACTIVITY | リクエストが、クレデンシャル スタッフィングまたはアカウントの乗っ取りのリスクが高いことを示します。 | 
| SUSPICIOUS_ACCOUNT_CREATION | リクエストが、悪用されたアカウント作成のリスクが高いことを示します。 | 
| PROFILE_MATCH | ユーザーの属性が、この特定のユーザーの以前に確認された属性に一致することを示します。この値は、このユーザーが以前モバイルアプリにアクセスするために使用した信頼できるデバイス上にいることを示します。 
 
 | 
イベントにアノテーションを付け、サイト固有のモデルを調整する
reCAPTCHA のアカウント保護機能に詳細情報を提供し、サイト固有の検出モデルを改善するには、評価を作成して評価したイベントにアノテーションを付ける必要があります。
評価にアノテーションを付けるには、評価 ID を使用して projects.assessments.annotate メソッドにリクエストを送信します。リクエストの本文には、評価で説明されているイベントに関する追加情報を提供するラベルを含めます。
評価にアノテーションを付けるには、次のようにします。
- 
ユースケースに応じて、リクエストの JSON 本文に追加する情報とラベルを決定します。 次の表では、イベントにアノテーションを付けるために使用できるラベルと値を示します。 ラベル 説明 リクエストの例 reasons必須。評価をサポートするラベル。 リアルタイムの検出に影響するため、イベント後数秒または数分で reasonsラベルにリアルタイムのイベントの詳細が提供されます。有効な値については、理由の値をご覧ください。 例: アカウントの乗っ取りを検出するには、入力したパスワードが正しいかどうかを CORRECT_PASSWORDまたはINCORRECT_PASSWORDの値でアノテーションを設定します。独自の MFA をデプロイした場合は、INITIATED_TWO_FACTOR、PASSED_TWO_FACTOR、FAILED_TWO_FACTORの値を追加できます。{ "reasons": ["INCORRECT_PASSWORD"] }annotation省略可。評価の正当性を示すラベル。 ログイン イベントと登録イベントに関する事実を提供して、 annotationラベルのリスク評価を検証または修正します。有効な値は LEGITIMATEまたはFRAUDULENTです。この情報はいつでも送信でき、またバッチジョブの一部として送信できます。 ただし、リアルタイムの検出に影響するため、この情報はイベント後数秒または数分で送信することをおすすめします。 { "annotation": "LEGITIMATE" }accountId省略可。アカウント ID をイベントに関連付けるラベル。 アカウント ID なしで評価を作成した場合は、イベントのアカウント ID を提供するために、利用可能な場合はこのラベルを使用します。 { "accountId": "ACCOUNT_ID" }
- 適切なラベルを使用してアノテーション リクエストを作成します。 - リクエストのデータを使用する前に、次のように置き換えます。 - ASSESSMENT_ID: projects.assessments.create呼び出しから返されたnameフィールドの値。
- ANNOTATION: 省略可。評価が正当か不正かを示すラベル。
- REASONS: 省略可。アノテーションをサポートする理由。有効な値については、理由の値をご覧ください。
- ACCOUNT_ID: 省略可。アプリのユーザー アカウントに一意に関連付けられた識別子。
 - 詳細については、アノテーションのラベルをご覧ください。 - HTTP メソッドと URL: - POST https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate - リクエストの本文(JSON): - { "annotation": ANNOTATION, "reasons": REASONS, "accountId": ACCOUNT_ID }- リクエストを送信するには、次のいずれかのオプションを選択します。 - curl- リクエスト本文を - request.jsonという名前のファイルに保存して、次のコマンドを実行します。- curl -X POST \ 
 -H "Authorization: Bearer $(gcloud auth print-access-token)" \
 -H "Content-Type: application/json; charset=utf-8" \
 -d @request.json \
 "https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate"- PowerShell- リクエスト本文を - request.jsonという名前のファイルに保存して、次のコマンドを実行します。- $cred = gcloud auth print-access-token 
 $headers = @{ "Authorization" = "Bearer $cred" }
 Invoke-WebRequest `
 -Method POST `
 -Headers $headers `
 -ContentType: "application/json; charset=utf-8" `
 -InFile request.json `
 -Uri "https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate" | Select-Object -Expand Content- 成功したことを示すステータス コード(2xx)と空のレスポンスが返されます。 
- ASSESSMENT_ID: 
コードサンプル
Java
reCAPTCHA に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
reCAPTCHA のアカウント保護機能を有効にする
reCAPTCHA のアカウント保護用にモバイルアプリを構成したら、reCAPTCHA のアカウント保護を有効にできます。
- Google Cloud コンソールで、[reCAPTCHA] ページに移動します。 
- ページの上部にあるリソース セレクタにリソース名が表示されていることを確認します。 - プロジェクトの名前が表示されない場合は、リソース セレクタをクリックしてプロジェクトを選択します。 
- [設定] をクリックします。
- [アカウント防御] ペインで [有効にする] をクリックします。   
- [アカウント防御の構成] ダイアログで [有効にする] をクリックして、[保存] をクリックします。   
reCAPTCHA のアカウント保護機能の有効化には、システムに反映されるまで数時間かかる場合があります。機能の有効化が Google のシステムに反映されると、評価の一環としてアカウント防御に関連するレスポンスを受信し始めます。
次のステップ
- その他のアカウント保護機能については、ユーザー アカウント保護機能をご覧ください。