Permit.io で認可 (Authorization) を設定する
Permit.io は、アプリケーション向けにきめ細かなアクセス制御を提供する認可 (Authorization) プラットフォームです。Logto と Permit.io を組み合わせて、ユーザーの認証 (Authentication) と認可 (Authorization) を管理できます。
認証 (Authentication) と認可 (Authorization) の主な違いについては、 認証 (Authentication) と認可 (Authorization) を参照してください。
このガイドでは、Logto と Permit.io を連携させてアプリケーションに認可 (Authorization) を実装する方法を紹介します。
前提条件
- Logto Cloud アカウント、または セルフホスト Logto
- Logto 認証 (Authentication) がすでに設定されている Next.js アプリケーション(未設定の場合は Next.js ガイド を参照)
- Permit.io アカウント。公式 Permit.io クイックスタートガイド に従って Permit.io プロジェクトをセットアップしてください。
統合手順
Permit.io SDK のインストール
アプリケーションに Permit.io SDK を追加します:
npm install permitio
Permit.io プロジェクトの作成
- permit.io で無料アカウントを作成
- 新しいプロジェクトを作成し、API キーを取得
- API キーを環境変数に追加:
PERMIT_API_KEY=your-permit-api-key
Permit.io クライアントのセットアップ
Permit.io 連携用のファイルを作成します:
// libraries/permit.js
const { Permit } = require('permitio');
// Permit.io クライアントを初期化
const permit = new Permit({
pdp: 'https://cloudpdp.api.permit.io',
token: 'your-permitio-api-key',
});
// ユーザーを Permit.io と同期
export const syncUserToPermit = async (userId, email, firstName, lastName, role = 'viewer') => {
// まずユーザーを同期
await permit.api.syncUser({
key: userId,
email: email || undefined,
first_name: firstName || undefined,
last_name: lastName || undefined,
});
// 次にユーザーにロールを割り当て
await permit.api.assignRole({
user: userId,
role: role,
tenant: 'default',
});
return true;
};
Logto のユーザー登録用 Webhook の作成
Logto は Webhook を提供しており、イベント発生時にアプリケーションへ通知できます。ここでは PostRegister
Webhook を利用して、 Permit.io へユーザーを同期 します。
アプリケーションに Webhook エンドポイントを作成します:
// pages/api/webhooks/logto.js
import { syncUserToPermit } from '../../../libraries/permit';
export default async function handler(req, res) {
// デバッグ用に Webhook ペイロードをログ出力
console.log('Webhook payload:', req.body);
const { event, user } = req.body;
// ユーザー登録イベントを処理
if (event === 'PostRegister') {
try {
// ユーザーのロールを決定(独自ロジックを実装可能)
let role = 'viewer'; // デフォルトロール
// ユーザーを Permit.io へ同期
await syncUserToPermit(user.id, user.primaryEmail, user.name, undefined, role);
return res.status(200).json({ success: true });
} catch (error) {
console.error('Error syncing user:', error);
return res.status(500).json({ error: 'Failed to sync user' });
}
}
return res.status(200).json({ message: 'Event ignored' });
}
Logto コンソールで Webhook を設定
- Logto コンソールの Webhook セクションへ移動
- 「Webhook を作成」をクリック
- Webhook に名前を付ける
- エンドポイント URL(例:
https://your-app.com/api/webhooks/logto
)を入力 PostRegister
イベントを選択- Webhook を保存
ローカル開発の場合は、 ngrok などのツールでローカルサーバーをインターネットに公開できます。
ユーザー同期のテスト
ユーザーが正しく同期されているかテストするには:
- アプリケーションで新しいユーザーアカウントを作成
- Permit.io ダッシュボードの「Directory」→「Users」でユーザーが同期されているか確認
- サインアップ時に正しいロールが割り当てられているか確認

Permit.io で認可 (Authorization) を利用
ユーザーが同期されたら、Permit.io で権限チェックが可能です:
// 権限チェックの例
const isPermitted = await permit.check(userId, 'view', 'reports');
if (isPermitted) {
// ユーザーはリソースの閲覧が許可されています
// リソース UI を表示
} else {
// ユーザーはリソースの閲覧が許可されていません
// アクセス拒否メッセージを表示
}
まとめ
Logto と Permit.io を連携し、ユーザーを自動同期してアプリケーションに認可 (Authorization) を実装できました。この統合により:
- ユーザーは Logto で認証 (Authentication)
- 新規ユーザーは Webhook 経由で自動的に Permit.io へ同期
- Permit.io で権限チェックやアクセス制御を実装可能
このセットアップは、アプリケーションの成長に合わせてより高度な認可 (Authorization) パターンを実装するための強固な基盤となります。
さらに高度な認可 (Authorization) ユースケースについては、 Permit.io のドキュメント でポリシー作成、権限の強制、ロールベースのアクセス制御の実装方法を参照してください。