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を必ず設定する