
シェア:
Benjamin AronovはVonageの開発者支援者です。彼はRuby on Railsのバックグラウンドを持つ実績のあるコミュニティ・ビルダーです。Benjaminは故郷であるテルアビブのビーチを楽しんでいる。テルアビブを拠点に、世界最高のスタートアップの創設者たちと出会い、学ぶことができる。技術以外では、完璧なパン・オ・ショコラを求めて世界中を旅するのが好き。
Identity Insights APIを使ってPythonでSIMスワップ詐欺を防ぐ
所要時間:1 分
SIMスワップ詐欺攻撃者が被害者の電話番号を新しいSIMカードに移すことで乗っ取るというものだ。これにより、通話やメール、二要素認証コードまでも傍受されてしまう。恐ろしい!
このチュートリアルでは、Python で Vonage Identity Insights API を使用して、潜在的な SIM 交換を検出し、ユーザーを保護します。
>> TL;DR:完全な 動作コードをGitHubで見る
前提条件
フォローするには、以下のものが必要だ:
Vonageデベロッパーアカウント
プロジェクト設定
Vonageアプリケーションの作成
アプリケーションを作成するには アプリケーションの作成ページでアプリケーションの名前を定義します。
Webhooksを使用するAPIを使用する場合は、秘密鍵が必要です。Generate public and private key "をクリックすると、自動的にダウンロードが始まります。この鍵は紛失すると再ダウンロードできません。この鍵は紛失しても再ダウンロードできません。 private_<あなたのアプリID>.key.この鍵はAPIコールの認証に使用できます。 注意:アプリケーションを保存するまで、キーは機能しません。
必要な機能(Voice、Messages、RTCなど)を選択し、必要なWebhook(イベントURL、応答URL、受信メッセージURLなど)を提供します。これらはチュートリアルで説明します。
保存してデプロイするには、"Generate new application "をクリックして設定を確定します。これでアプリケーションはVonage APIで使用する準備が整いました。
Pythonスクリプトは ネットワークレジストリサンドボックス.そのためには、Vonage アプリケーションを Vonage Dashboardで作成します:
ネットワークレジストリ機能を有効にし、"Playground "を選択する。
を生成する。
private.key次のセクションで、これをディレクトリのルートに移動する必要があります。
プロジェクトの作成と依存関係のインストール
ターミナルにプロジェクトフォルダとファイルを作成します。
mkdir sim_swap_checker
cd sim_swap_checker
touch main.py .env>>これでダウンロードした
private.keyをsim_swap_checkerディレクトリ
2.仮想環境を設定する。
これにより、依存関係がシステムPythonから分離された状態に保たれる。
python3 -m venv venv
source venv/bin/activate3.必要なパッケージをインストールする。
を使用します。 requestsを使用して Identity Insights API に HTTP リクエストを行います、 python-dotenv環境ファイルから API 認証情報をセキュアにロードする。 vonage-jwtリクエストを認証するためのセキュアな JWT トークンを生成します。
pip install requests python-dotenv vonage-jwt ENVファイルの設定
を追加します。 IDAPIがSIMスワップ・チェックを実行する期間(時間)を追加します。
をご覧ください。 Identity Insights APIリファレンスという単一のパラメータに依存していることがわかります。 periodここでは hour と呼び、デフォルトを 240 とする。
VONAGE_APPLICATION_ID=your_application_id
VONAGE_PRIVATE_KEY_PATH=./private.key
PHONE_NUMBER=+990123455
DEFAULT_HOURS=240 シムの入れ替えをチェックするPythonスクリプトを書く
ステップ1:インポートと環境のセットアップ
ファイルの中で main.pyファイルで、ユーザーが定義した時間枠(デフォルトは240時間、つまり10日間)内にSIMスワップが発生したかどうかをチェックするメインスクリプトをビルドしてみましょう。
必要なライブラリをインポートし、.envファイルから環境変数をロードすることから始めます。こうすることで、微妙な値をハードコードすることがなくなり、異なる値をテストするために電話番号と期間を素早く更新することが簡単になります。
# main.py
import requests
from dotenv import load_dotenv
import os
from vonage_jwt import JwtClient
load_dotenv()
API_URL = "https://api-eu.vonage.com/v0.1/identity-insights"
PHONE_NUMBER = os.getenv("PHONE_NUMBER")
DEFAULT_HOURS = int(os.getenv("DEFAULT_HOURS"))
application_id = os.getenv("VONAGE_APPLICATION_ID")
private_key_path = os.getenv("VONAGE_PRIVATE_KEY_PATH") ステップ2:JWTによる認証
Identity Insights API を呼び出す前に、JWT(JSON Web Token)を使用して認証する必要があります。 JSON ウェブトークン (JWT).これはすべての Vonage Network API で必要です。
JWTは、あなたのアプリケーションと秘密鍵を使用して、あなたのアプリケーションを安全に識別します。 APPLICATION_IDと秘密鍵を使用してアプリケーションを安全に識別し、発行日 ( iat )や有効期限( exp ).これらのトークンは RS256アルゴリズムを使用して署名され、通常数分間だけ有効であるため、安全で短命です。
環境変数の下でJwtClientを初期化します。このクライアントを使用して、APIリクエストを行う際に実際のJWTを生成します。
with open(private_key_path, "r") as f:
private_key_str = f.read()
jwt_client = JwtClient(application_id, private_key_str) ステップ3:コアSIMスワップチェック機能の定義
次に、以下に続けて check_sim_swap()関数を定義します。JWT クライアントを使用して認証し、Identity Insights API に POST リクエストを送信します。
# main.py
def check_sim_swap(phone_number, hours):
jwt_token = jwt_client.generate_application_jwt()
headers = {
"Authorization": f"Bearer {jwt_token}",
"Content-Type": "application/json"
}
payload = {
"phone_number": phone_number,
"purpose": "FraudPreventionAndDetection",
"insights": {
"format": {},
"sim_swap": {
"period": hours
}
}
}
print(f"\n🔍 Checking SIM swap status for {phone_number}...")
res = requests.post(API_URL, headers=headers, json=payload)
if res.status_code != 200:
print("❌ Error:", res.status_code, res.text)
return
data = res.json()このコードは目的を "FraudPreventionAndDetection" に設定する。API が 200 OKを返したら、エラーをコンソールに表示して終了します。
ステップ4:SIMスワップ結果の解析と表示
次に、SIMスワップデータを抽出し、応答ステータスをチェックします。問題がなければ、指定された時間枠の間にスワップが検出されたかどうか、そして最後の SIM スワップがいつ発生したかを表示します。
sim_swap_info = data.get("insights", {}).get("sim_swap", {})
status_code = sim_swap_info.get("status", {}).get("code")
if status_code != "OK":
print(f"\n⚠️ SIM Swap check failed. Status: {status_code}")
print(" Message:", sim_swap_info.get("status", {}).get("message"))
return
swapped = sim_swap_info.get("swapped")
swap_time = sim_swap_info.get("latest_sim_swap_at")
print(f"\n🔒 SIM Swap Results:")
print(f" SIM Swapped: {'❌ Yes' if swapped else '✅ No'}")
print(f" Last SIM Swap: {swap_time if swap_time else 'None detected'}") ステップ5:対話性のためのCLIラッパーの追加
最後に mainブロックを追加し、ユーザーがコマンドラインから対話的にスクリプトを実行できるようにしている。電話番号とチェックする時間数の入力を求めるプロンプトが表示され、何も入力されなければデフォルトに戻る。
バーチャル・オペレーター 仮想オペレーターには、テストに使用できる Identity Insight API 用の電話番号が 9 つあります。API は決定論的な SIM 交換応答を返します:
もし
hours > 500を返す。swapped = trueもし
hours < 500を返す。swapped = false
を使ってテストすることもできます。 許可リスト番号を試すこともできる。
if __name__ == "__main__":
print("=== Vonage Identity Insights - SIM Swap Checker ===")
phone = input(f"Enter phone number [Default: {PHONE_NUMBER}]: ").strip() or PHONE_NUMBER
hours = input(f"How many hours ago to check for? [Default: {DEFAULT_HOURS}]: ").strip() or DEFAULT_HOURS
hours = int(hours)
check_sim_swap(phone, hours)>> このコードがリンターによって自動インデントされずに
check_sim_swap関数の中にあることを確認してください。
仮想オペレータでスクリプトをテストする
これで小さなアプリをテストできる!
python3 main.pyまず、デフォルト値を使用し、シムがスワップされなかったことを確認します:
(venv) ➜ sim_swap_checker python main.py
=== Vonage Identity Insights - SIM Swap Checker ===
Enter phone number [Default: +990123455]:
How many hours ago to check for? [Default: 240]:
🔍 Checking SIM swap status for +990123455...
🔒 SIM Swap Results:
SIM Swapped: ✅ No
Last SIM Swap: 2025-07-10T08:48:55.143Zそして、シムスワップを見るには、500時間より高い時間の値を使うことができる:
(venv) ➜ sim_swap_checker python main.py
=== Vonage Identity Insights - SIM Swap Checker ===
Enter phone number [Default: +990123455]:
How many hours ago to check for? [Default: 240]: 600
🔍 Checking SIM swap status for +990123455...
🔒 SIM Swap Results:
SIM Swapped: ❌ Yes
Last SIM Swap: 2025-07-10T08:50:16.733Z 結論
わずか数行の Python と Vonage Identity Insights API を使用するだけで、SIM 交換イベントを特定し、アプリケーションでリスクの高いシナリオにプロアクティブにフラグを立てることができます。このデモではテスト用に仮想オペレータを使用していますが、アプリケーションが ネットワーク・レジストリ.
質問がありますか?私たちと一緒に VonageコミュニティSlackフォローする YouTubeチャンネルまたは 開発者向けニュースレターを購読してください。