PHP

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

LaravelプロジェクトにpAuth着信認証APIを組み込む手順をステップバイステップで解説します。 ユーザーは指定番号に1コール電話するだけで本人確認が完了します。

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

前提条件

  • PHP 8.1以上 / Laravel 10以上
  • pauth.me APIキー(無料登録で取得)
  • Guzzle HTTP クライアント(Laravel標準で利用可能)

Step 1: 環境変数の設定

.env ファイルにAPIキーを追加します。

PAUTH_API_KEY=your_api_key_here
PAUTH_BASE_URL=https://api.pauth.me

Step 2: 認証セッションの開始

ユーザーの電話番号を受け取り、pAuth APIでセッションを作成します。

use Illuminate\Support\Facades\Http;

class AuthController extends Controller
{
    public function startVerification(Request $request)
    {
        $response = Http::withToken(config('services.pauth.api_key'))
            ->post(config('services.pauth.base_url') . '/v1/auth/sessions', [
                'phone_number' => $request->phone_number,
                'callback_url' => route('auth.callback'),
            ]);

        $session = $response->json();
        session(['pauth_session_id' => $session['id']]);

        return response()->json([
            'session_id' => $session['id'],
            'call_number' => $session['call_number'], // ユーザーがかける電話番号
        ]);
    }
}

Step 3: 認証完了の確認(ポーリング)

フロントエンドから定期的にステータスを確認します。

public function checkStatus(Request $request)
{
    $sessionId = session('pauth_session_id');
    $response = Http::withToken(config('services.pauth.api_key'))
        ->get(config('services.pauth.base_url') . "/v1/auth/sessions/{$sessionId}");

    $data = $response->json();

    if ($data['status'] === 'verified') {
        // 認証成功: ログイン処理へ
        Auth::login(User::where('phone', $request->phone)->first());
        return response()->json(['status' => 'verified']);
    }

    return response()->json(['status' => $data['status']]);
}

エラーハンドリング

if ($response->failed()) {
    logger()->error('pAuth API error', $response->json());
    return back()->withErrors(['phone' => '認証の開始に失敗しました。時間をおいて再試行してください。']);
}

// タイムアウト(セッション有効期限切れ)
if ($data['status'] === 'expired') {
    return response()->json(['status' => 'expired', 'message' => '認証がタイムアウトしました。'], 408);
}

本番環境の注意点

  • APIキーは必ず .env で管理し、コードにハードコードしない
  • ポーリング間隔は2〜3秒、最大試行回数(例:30回 = 1分)を設定する
  • セッションIDはサーバーサイドセッションまたはDBで管理し、なりすましを防ぐ
  • 本番では PAUTH_BASE_URL をproduction URLに変更する

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