Node.js

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

Node.js/ExpressプロジェクトにpAuth着信認証APIを組み込む手順を解説します。 軽量なミドルウェア構成でAPIサーバーに着信認証を追加できます。

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

前提条件

  • Node.js 18以上 / Express 4以上
  • pauth.me APIキー(無料登録で取得)
  • npm install express axios dotenv express-session

Step 1: 環境変数の設定

# .env
PAUTH_API_KEY=your_api_key_here
PAUTH_BASE_URL=https://api.pauth.me
SESSION_SECRET=your_session_secret

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

// routes/auth.js
const express = require('express')
const axios = require('axios')
require('dotenv').config()

const router = express.Router()

router.post('/start', async (req, res) => {
  try {
    const { phoneNumber } = req.body
    const response = await axios.post(
      `${process.env.PAUTH_BASE_URL}/v1/auth/sessions`,
      {
        phone_number: phoneNumber,
        callback_url: `${req.protocol}://${req.get('host')}/auth/callback`,
      },
      {
        headers: { Authorization: `Bearer ${process.env.PAUTH_API_KEY}` }
      }
    )

    req.session.pauthSessionId = response.data.id
    res.json({
      sessionId: response.data.id,
      callNumber: response.data.call_number,
    })
  } catch (error) {
    res.status(500).json({ error: '認証の開始に失敗しました' })
  }
})

Step 3: 認証状態の確認

router.get('/status', async (req, res) => {
  const sessionId = req.session.pauthSessionId
  if (!sessionId) return res.status(400).json({ error: 'Session not found' })

  const response = await axios.get(
    `${process.env.PAUTH_BASE_URL}/v1/auth/sessions/${sessionId}`,
    { headers: { Authorization: `Bearer ${process.env.PAUTH_API_KEY}` } }
  )

  const { status, phone_number } = response.data
  if (status === 'verified') {
    req.session.userId = await getUserByPhone(phone_number)
  }

  res.json({ status })
})

エラーハンドリング

// axios エラーインターセプター
axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response?.status === 401) {
      console.error('pAuth: Invalid API key')
    } else if (error.response?.status === 429) {
      console.error('pAuth: Rate limit exceeded')
    }
    return Promise.reject(error)
  }
)

// セッション期限切れ
if (response.data.status === 'expired') {
  delete req.session.pauthSessionId
  return res.status(408).json({ status: 'expired' })
}

本番環境の注意点

  • APIキーは必ず .env で管理し、Gitにコミットしない(.gitignore に追加)
  • セッションストアはRedis(connect-redis)を使用することを推奨
  • HTTPS必須: HTTP環境では cookie.secure: true が機能しないため必ずHTTPS化する
  • Rate limiting: express-rate-limit で認証エンドポイントを保護する

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