Python

pauth.me × Flask — 着信認証API実装ガイド

Python/FlaskプロジェクトにpAuth着信認証APIを組み込む手順を解説します。 Flaskのシンプルな構造を活かし、Blueprintで認証機能を整理します。

※本ページのコード例は説明目的の擬似コードです。実際の実装では環境に合わせた調整が必要です。

前提条件

  • Python 3.9以上 / Flask 2.0以上
  • pauth.me APIキー(無料登録で取得)
  • pip install flask requests python-dotenv

Step 1: 環境変数と設定

# .env
PAUTH_API_KEY=your_api_key_here
PAUTH_BASE_URL=https://api.pauth.me
SECRET_KEY=your_flask_secret_key

# config.py
from dotenv import load_dotenv
import os
load_dotenv()

class Config:
    PAUTH_API_KEY = os.getenv('PAUTH_API_KEY')
    PAUTH_BASE_URL = os.getenv('PAUTH_BASE_URL')
    SECRET_KEY = os.getenv('SECRET_KEY')

Step 2: 認証Blueprint の作成

# auth/routes.py
import requests
from flask import Blueprint, request, session, jsonify, current_app

auth_bp = Blueprint('auth', __name__, url_prefix='/auth')

@auth_bp.route('/start', methods=['POST'])
def start_verification():
    phone_number = request.json.get('phone_number')
    api_key = current_app.config['PAUTH_API_KEY']
    base_url = current_app.config['PAUTH_BASE_URL']

    try:
        response = requests.post(
            f"{base_url}/v1/auth/sessions",
            headers={'Authorization': f'Bearer {api_key}'},
            json={
                'phone_number': phone_number,
                'callback_url': request.url_root + 'auth/callback',
            }
        )
        response.raise_for_status()
        data = response.json()

        session['pauth_session_id'] = data['id']
        return jsonify({
            'session_id': data['id'],
            'call_number': data['call_number'],
        })
    except requests.HTTPError as e:
        return jsonify({'error': str(e)}), 500

Step 3: 認証状態の確認

@auth_bp.route('/status', methods=['GET'])
def check_status():
    session_id = session.get('pauth_session_id')
    if not session_id:
        return jsonify({'error': 'No active session'}), 400

    api_key = current_app.config['PAUTH_API_KEY']
    base_url = current_app.config['PAUTH_BASE_URL']

    response = requests.get(
        f"{base_url}/v1/auth/sessions/{session_id}",
        headers={'Authorization': f'Bearer {api_key}'}
    )
    data = response.json()

    if data['status'] == 'verified':
        session['user_phone'] = data['phone_number']
        session.pop('pauth_session_id', None)

    return jsonify({'status': data['status']})

エラーハンドリング

from requests.exceptions import ConnectionError, Timeout, HTTPError

@auth_bp.errorhandler(Exception)
def handle_auth_error(e):
    if isinstance(e, ConnectionError):
        return jsonify({'error': 'API接続に失敗しました'}), 503
    elif isinstance(e, Timeout):
        return jsonify({'error': '接続タイムアウト'}), 504
    return jsonify({'error': '認証エラーが発生しました'}), 500

本番環境の注意点

  • APIキーは .env で管理し、app.config 経由で参照する
  • Flaskの組み込みセッション(cookie-based)は本番で SECRET_KEY を十分に複雑にする
  • 大規模運用では Flask-Session + Redis を推奨
  • WSGI サーバー(gunicorn等)でのデプロイ時は app.debug = False を必ず設定する

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