pauth.me × Django — 着信認証API実装ガイド
DjangoプロジェクトにpAuth着信認証APIを組み込む手順を解説します。
Pythonの requests ライブラリを使い、シンプルなビューで実装できます。
※本ページのコード例は説明目的の擬似コードです。実際の実装では環境に合わせた調整が必要です。
前提条件
- Python 3.9以上 / Django 4.0以上
- pauth.me APIキー(無料登録で取得)
- requests ライブラリ(
pip install requests python-decouple)
Step 1: 環境変数の設定
# .env
PAUTH_API_KEY=your_api_key_here
PAUTH_BASE_URL=https://api.pauth.me
# settings.py
from decouple import config
PAUTH_API_KEY = config('PAUTH_API_KEY')
PAUTH_BASE_URL = config('PAUTH_BASE_URL')
Step 2: 認証セッションの開始
# views.py
import requests
import json
from django.conf import settings
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def start_verification(request):
if request.method != 'POST':
return JsonResponse({'error': 'Method not allowed'}, status=405)
data = json.loads(request.body)
phone_number = data.get('phone_number')
response = requests.post(
f"{settings.PAUTH_BASE_URL}/v1/auth/sessions",
headers={
'Authorization': f"Bearer {settings.PAUTH_API_KEY}",
'Content-Type': 'application/json',
},
json={
'phone_number': phone_number,
'callback_url': request.build_absolute_uri('/auth/callback/'),
}
)
response.raise_for_status()
session_data = response.json()
request.session['pauth_session_id'] = session_data['id']
return JsonResponse({
'session_id': session_data['id'],
'call_number': session_data['call_number'],
})
Step 3: 認証状態の確認
def check_status(request):
session_id = request.session.get('pauth_session_id')
if not session_id:
return JsonResponse({'error': 'Session not found'}, status=400)
response = requests.get(
f"{settings.PAUTH_BASE_URL}/v1/auth/sessions/{session_id}",
headers={'Authorization': f"Bearer {settings.PAUTH_API_KEY}"}
)
data = response.json()
if data['status'] == 'verified':
user = User.objects.get(phone=data['phone_number'])
login(request, user)
return JsonResponse({'status': data['status']})
エラーハンドリング
try:
response.raise_for_status()
except requests.exceptions.HTTPError as e:
return JsonResponse({'error': str(e)}, status=response.status_code)
except requests.exceptions.ConnectionError:
return JsonResponse({'error': 'API接続に失敗しました'}, status=503)
except requests.exceptions.Timeout:
return JsonResponse({'error': '接続タイムアウト'}, status=504)
本番環境の注意点
- APIキーは
.envまたは環境変数で管理し、settings.pyにハードコードしない - DjangoセッションはRedis(django-redis)でバックエンドを管理することを推奨
- CSRF保護:
@csrf_exemptはAPIエンドポイントのみに限定し、適切なトークン管理を行う - ポーリングは最大30回程度に制限し、タイムアウト時は適切なメッセージを表示する