> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# 位置情報認証API：ジオフェンシングとIP距離チェック

> Diditで認証時の本人の所在地を確認。デバイス位置、ジオフェンシング、IPと書類の距離、なりすまし検知に対応。1回あたり$0.05。

Diditの位置情報検証ステップは、本人確認の実施中に本人がどこにいるかを確認します。デバイスの位置(ブラウザーまたはネイティブSDK)または接続のIP位置情報を一度だけ読み取り、許可エリアと禁止エリア、IP位置情報、書類に記載された住所と照合します。
ワークフローとAPIでは`GEOLOCATION`機能として扱われ、設定は`geolocation_*`キー、結果はセッションの判定に含まれる`geolocation_checks[]`です。

## 利用すべきケース

* 一部の法域でのみライセンスを保有しており(ギャンブル、証券仲介、貸付など)、申込時に本人がその法域内にいたことを証明する必要がある場合。
* 制裁対象地域やサービスを提供していない州など、禁止された場所にいる人を排除する必要がある場合。
* IP位置情報やIDの住所から大きく離れたデバイス位置、偽装された位置、VPN、エミュレーターなど、不正検知のシグナルをもう一つ追加したい場合。
* 本人の移動や履歴は不要で、セッション中に取得した1回の測位結果だけが必要な場合。

## 仕組み

**1. 通知と許可**

本人には、位置情報が必要な理由と、この認証のために一度だけ読み取られることが表示されます。
その後、ブラウザーまたはスマートフォンが許可を求めます。
Diditは本人が同意した通知(バージョン、言語、日時)を結果の`consent`として記録します。

**2. 1回の試行につき1つの位置**

クライアントは、精度が十分になるか、試行ごとのタイムアウト(デフォルトは20秒)が切れるまで、最も良い測位結果を保持します。
各試行には5分間有効でセッションに紐付けられた使い捨てのチャレンジが含まれるため、傍受された送信を再利用(リプレイ)することはできません。

**3. チェック**

Diditは、精度、鮮度、おおよその位置情報の許可、なりすましのシグナル、エリア、IP位置情報および書類の住所までの距離、VPN・プロキシ・Tor・エミュレーターの検出結果、本人の過去のチェックを判定します。

**4. 結果**

各検出結果は[警告](https://docs.didit.me/ja/core-technology/location-verification/warnings-location-verification.md)を発生させ、その警告に設定されたアクション(`NO_ACTION`、`REVIEW`、`DECLINE`)がステップのステータスを決定します。
最も強いアクションが優先されます。

## 位置の取得元

位置の取得元は`geolocation_position_source`で選択します。

| 値 | 動作 |
| - | - |
| `device_and_ip` | デバイスの位置を、その位置が送信された接続のIP位置情報と照合します。 |
| `device_only` | デバイスの位置のみを使用します。IP位置情報と比較されることは一切ありません。 |
| `ip_only` | 本人に許可を求めることはありません。代わりに接続のIP位置情報(市区町村レベル、半径50 km)を判定し、精度、鮮度、おおよその位置情報の許可に関するルールは適用されません。 |
| 未設定 | デバイスに位置情報を要求し、その位置をセッションのデバイス・IP分析ステップが観測したIP位置情報と比較します。VPN、プロキシ、Torの検出結果に基づいてアクションを実行するノードは、接続を照会し、`device_and_ip`と同じように動作します。 |

デバイスに位置情報を要求するノードでは、位置が得られなかった試行は、拒否または失敗の状況に応じて判定されます。IP位置情報がその代わりに使われることはありません。

## 設定のデフォルト値と制限

すべてのキーは任意です。
全一覧は[ワークフロー機能設定リファレンス](https://docs.didit.me/ja/management-api/workflows/feature-configs.md#位置情報検証)にあります。

| 設定 | デフォルト | 制限 |
| - | - | - |
| `geolocation_max_accuracy_radius_m` | 250 m | 10〜50,000 m |
| `geolocation_max_age_seconds` | 120 s | 5〜3,600 s |
| `geolocation_timeout_seconds` | 20 s | 5〜120 s |
| `geolocation_max_attempts` | 3 | 1〜5 |
| `geolocation_accuracy_mode` | `precise` | `precise`または`approximate_allowed` |
| `geolocation_low_accuracy_behavior` | `ask_again` | `ask_again`または`fail` |
| `geolocation_allow_qr_handoff` | オン | オンまたはオフ |
| `geolocation_allow_skip` | オフ | オンまたはオフ |
| `geolocation_refusal_path` | `retry_then_handoff` | `retry_then_handoff`、`continue_without_location`、`end_session` |
| `is_geolocation_geofencing_enabled` | オフ | オンまたはオフ |
| `geolocation_ip_distance_km` | 200 km | 0以上、`null`で比較を無効化 |
| `geolocation_document_distance_km` | オフ | 0以上 |
| `geolocation_travel_tolerance_enabled` | オフ | 通常のエリアは10〜500 km(デフォルトは100)、1〜90日(デフォルトは14) |
| `geolocation_consecutive_mismatch_count` | オフ | 2〜10 |

### プリセット

`geolocation_preset`は、未設定のままにしたすべてのアクションのデフォルトを設定します。
`licensing`は、許可エリア外、禁止エリア内、VPNまたはTor経由、またはエミュレーターで取得された位置情報を却下し、プロキシはレビューに回します。
`fraud_screening`は同じ基準で判定しますが、`licensing`で却下されるものはすべてレビューに回します。
明示的に設定したアクションが常に優先されます。

## ジオフェンシング

`is_geolocation_geofencing_enabled`をオンにし、`geolocation_areas`を列挙します。
エリアには、国全体、1つの国の地域(ISO 3166-2)、円(1〜500 km)、多角形(3〜200点)を指定できます。
許可エリア内の位置のみが合格し、禁止エリアは常に許可エリアより優先されます。
1つのリストには最大50個のエリアを含めることができ、少なくとも1つの許可エリアが必要です。

Diditは位置の中心だけでなく、精度円全体を判定します。

* すべての許可エリアの完全に外側にある円は`LOCATION_OUTSIDE_GEOFENCE`となります。
* 判定を左右する境界をまたぐ円は`LOCATION_GEOFENCE_UNDETERMINED`となり、「外側」と判定されることはありません。
* 禁止エリアの完全に内側にある円は`LOCATION_IN_BLOCKED_AREA`となり、許可エリアの判定結果に加えて発生します。

国や地域の範囲は、海岸線ではなく、他の陸地が始まる地点で終わります。
本人にはサービスを利用できる場所が表示されますが、どのエリアが禁止されているかは一切表示されません。
エリアのルールは`ip_only`ステップでも機能し、IP位置情報に基づいて判定されます。
従来の`geolocation_geofencing_by_country`設定も引き続き使用できますが、`geolocation_areas`と併用することはできません。

## 距離チェック

| チェック | 測定対象 | 設定 |
| - | - | - |
| IP距離 | デバイスの位置とIPアドレスの位置の間の距離です。両方の不確実性半径を差し引いた値で、0は両者が重なっていることを意味します。 | `geolocation_ip_distance_km`、`geolocation_ip_distance_action` |
| 書類との距離 | 位置と住所の間の距離です。住所は大まかにジオコーディングされるため、弱いシグナルです。 | `geolocation_document_distance_km`、`geolocation_document_distance_basis`、`geolocation_document_distance_action` |
| 連続不一致 | 同じ`vendor_data`を持つ本人の過去のチェックのうち、許可エリア外、ブロック対象エリア内、または住所から離れすぎていたものです。 | `geolocation_consecutive_mismatch_count` |

`geolocation_document_distance_basis`は使用する住所を選択します。選択肢は`document`(本人確認書類、次に住所証明)、`proof_of_address`、または`declared`(セッション作成時の`expected_details.address`)です。
`geolocation_travel_tolerance_enabled`を有効にすると、直近`geolocation_travel_max_days`日以内に住所の近くで確認された本人は、現在住所から離れていてもフラグが立てられません。
移動許容によっても、VPN、なりすまされた位置、ブロック対象エリア、許可エリア外の位置は免除されません。

## なりすましと完全性のシグナル

* **モックプロバイダー**:AndroidとiOSは、位置が測定ではなくシミュレートされたものである場合にそれを報告します。
* **デバイスアテステーション**:ネイティブSDKはデバイスアテステーションを添付できます。アテステーションに失敗した場合は常に却下されます。アテステーションがない場合は記録され、デフォルトではアクションは実行されません。ブラウザはデバイスアテステーションを実行できないため、失敗ではなく`unsupported`として記録されます。
* **VPN、プロキシ、Tor**:位置情報を共有した接続で検出されます。いずれかに対するアクションが`NO_ACTION`以外の場合、試行回数が残っている間は、本人にそれをオフにして再度確認するよう求めます。
* **エミュレーター**:ネイティブアプリでのみ報告されます。再試行してもデバイスは変わらないため、エミュレーターが検出されるとその試行でステップが終了します。
* **リプレイ**:別のセッションで提示されたチャレンジは常に却下されます。

## 結果

ステップで受け入れられた試行には、1つの`outcome`があります。

| 結果 | 意味 |
| - | - |
| `verified` | すべてのルールを満たした位置です。 |
| `low_accuracy` / `accuracy_undetermined` | 半径が上限より広かったか、デバイスが半径を報告しませんでした。 |
| `stale` | 位置が`geolocation_max_age_seconds`より古いものでした。 |
| `approximate` | 正確な位置が必要なのに、おおよその位置のみが許可されました。 |
| `denied` / `restricted` | 本人が拒否したか、システムが位置情報をブロックしています。 |
| `unavailable` / `timeout` | デバイスが位置を取得できなかったか、時間内に取得できませんでした。 |
| `mock_detected` | システムがその位置をシミュレートされたものとして報告しました。 |
| `outside_geofence` / `in_blocked_area` | 位置がすべての許可エリアの外にあるか、ブロック対象エリア内にあります。 |
| `anonymizer_detected` | VPN、プロキシ、Tor出口ノード、またはエミュレーターが検出され、ワークフローがそれに対してアクションを実行する設定になっています。 |
| `skipped` | 本人が位置情報を共有せずに続行しました。 |
| `replay_rejected` | チャレンジが別のセッションのものでした。 |
| `unsupported_client` | アプリまたはSDKが古すぎて、このステップを表示できません。 |

試行回数が残っている間は、半径が広い、古い、おおよその位置、拒否、または許可エリア外もしくはブロック対象エリア内という結果の場合、本人に再試行を求めます。警告を発するのは最後の試行のみです。
シミュレートされた位置、またはワークフローがアクションを実行する対象のエミュレーターが報告された場合、ステップはその試行で終了します。

## ユーザー体験

### 同意と権限

本人が通知に同意し、システムのプロンプトに応答するまで、何も読み取られません。
通知には、位置情報はこの認証のために1回だけ読み取られ、本人の移動の記録ではないことが記載されています。
拒否した人は`geolocation_refusal_path`に従って扱われます。

* `retry_then_handoff`は、試行回数が残っている間は再度許可を求め、その後スマートフォンで続行するよう提案します。
* `continue_without_location`は、位置情報なしで続行することを提案し、拒否を結果として記録します。
* `end_session`は、最初の拒否でステップとセッションを終了します。`geolocation_permission_denied_action`が`REVIEW`または`DECLINE`である必要があり、セッションが承認されることはありません。

`geolocation_allow_skip`を有効にすると、本人はいつでも位置情報なしで続行でき、ステップは`geolocation_unavailable_action`によって判定されます。

### ブラウザ

ホスト型フローはブラウザに位置情報を要求し、サイトで位置情報がオフになっている場合はChromeとSafari向けの手順を表示します。
ブラウザは正確な許可とおおよその許可を区別できないため、Webでの結果では`LOCATION_APPROXIMATE_ONLY`が発生することはなく、モックプロバイダー、エミュレーター、デバイスアテステーションが報告されることもありません。
PCは正確な位置を共有できないため、フローは本人のスマートフォンで同じ認証を続行するためのQRコードを提示します(`geolocation_allow_qr_handoff`、デフォルトで有効)。スマートフォンでの操作が完了すると、PC側は自動的に次に進みます。
フローをiframeに埋め込む場合は、`allow`属性に`geolocation`を含めてください。[コンテキスト内iframe](https://docs.didit.me/ja/integration/web-sdks/incontext-iframe.md)を参照してください。
位置情報の権限ポリシーをブロックしているページは、本人の拒否ではなくサイトの判断として扱われます。

### ネイティブSDK

iOSおよびAndroidのSDKはOSに位置情報の権限を要求し、デバイスアテステーションとモック位置情報フラグを添付できます。
iOSでは`Info.plist`に`NSLocationWhenInUseUsageDescription`を追加してください。AndroidではSDKが`ACCESS_FINE_LOCATION`と`ACCESS_COARSE_LOCATION`を宣言し、ワークフローにこのステップがある場合にのみ実行時に許可を求めます。
[ネイティブSDK](https://docs.didit.me/ja/integration/native-sdks/overview.md)を参照してください。
iOSまたはAndroidでおおよその位置のみが許可された場合、`geolocation_accuracy_mode`が`approximate_allowed`でない限り、`LOCATION_APPROXIMATE_ONLY`が発生します。
このステップに対応していない古いアプリまたはSDKのビルドは、セッションが停止したままにならないよう、`unsupported_client`で完了扱いになります。

## 判定で返される内容

[セッションの判定](https://docs.didit.me/ja/sessions-api/retrieve-session.md)と`status.updated` Webhookには、2つのリストが含まれます。

* `geolocation_checks[]`：位置情報ステップごとに1項目で、そのステップで採用された試行とその`warnings`を保持します。
* `geolocation_attempts[]`：すべての位置情報ステップのすべての試行が、古い順に並びます。

すべてのフィールドについては、[位置情報検証レポート](https://docs.didit.me/ja/core-technology/location-verification/report-location-verification.md)を参照してください。
座標、精度、都市、国はエンドユーザーの個人データです。そのため、ワークフローのレスポンス属性を使って、判定で返す`geolocation_checks`のフィールドを制限できます。

## 料金

位置情報検証の料金は**チェック1件あたり\$0.05**で、無料枠の対象外です。
チェックが実行されて結果が返されるため、Diditは結果にかかわらず、セッション内の位置情報ステップごとに1回課金します。
同じステップ内での再試行は無料です。
再提出によってステップがもう一度完了した場合は、再度課金されます。

## サンドボックス

サンドボックスのセッションでも、同じホスト型フローで同じステップが実行され、デバイスやブラウザは実際の位置を報告します。
サンドボックスのセッションはIP照会サービスに接続しないため、IPの比較にはセッションがすでに保持している情報のみが使われます。
利用は料金0で記録されるため、サンドボックスのセッションが課金されることはありません。
このステップには、特定の結果を返す特殊な入力値はありません。

## 関連ページ

* [位置情報検証レポート](https://docs.didit.me/ja/core-technology/location-verification/report-location-verification.md)：`geolocation_checks[]`と`geolocation_attempts[]`のすべてのフィールド。
* [位置情報検証の警告](https://docs.didit.me/ja/core-technology/location-verification/warnings-location-verification.md)：すべての`LOCATION_*`コードとそのアクション。
* [ワークフロー機能の設定](https://docs.didit.me/ja/management-api/workflows/feature-configs.md#位置情報検証)：すべての`geolocation_*`キー。
* [デバイス・IP分析](https://docs.didit.me/ja/core-technology/ip-analysis/overview.md)：セッションのIP位置情報とVPNのチェック。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.