Python

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回程度に制限し、タイムアウト時は適切なメッセージを表示する

他のフレームワークでの実装