会員基盤「memberkit」を、オープンソース(AGPL-3.0)で公開しました。
〜 ログインできることと、会員であることは違う。その先を全部書きました 〜
2026年9月4日
株式会社NUP WHITE
当社は、会員基盤「memberkit」を OSS(AGPL-3.0)として公開しました。
登録 → メール認証 → 管理者承認 → プラン契約 → 権限付与 → 退会 → 権限停止 という会員ライフサイクル全体を実装済みのアプリケーションです。自己ホストして商用にお使いいただけます。
リポジトリ: https://github.com/nup-cloud/memberkit
公開時点の数字
| 7 | 実装済みの会員状態(登録 〜 権限停止) |
| 123 | 単体テスト |
| 77 | E2E テスト(攻撃シナリオ中心) |
| 8 | 管理コンソールの画面数 |
| 9 | MCP ツール |
| AGPL-3.0 | ライセンス(商用ライセンスも用意) |
背景:Firebase Auth や Auth0 が面倒を見るのは「ログインまで」
認証サービスが引き受けてくれるのは、「本人かどうか」の確認までです。その先、会員として扱ってよいのかどうかは、毎回アプリケーション側で作ることになります。
| その先にあるもの | 中身 |
|---|---|
| 承認 | 入会申請の確認・承認。承認待ちの人をどう扱うか |
| プラン | 契約・課金・プラン変更・支払い失敗時の扱い |
| 権限 | ロール・権限の設計と付与、そして取り消し |
| 退会 | 退会・データ削除・保全期間・再入会 |
この 4 つは、サービスごとに毎回ゼロから書かれ、そのたびに「退会したのに権限が残っていた」「承認前に決済が通った」といった事故が起きています。
memberkit は、この「その先」を全部書いたものです。
会員機能、ここまで入っています
REGISTERED → EMAIL_VERIFICATION_REQUIRED → PENDING_APPROVAL → APPROVED → ACTIVE
↓ ↓
REJECTED PAST_DUE → CANCEL_PENDING → CANCELLED
入場できるのは ACTIVE / CANCEL_PENDING / PAST_DUE の 3 状態だけで、判定はアプリ内の 1 箇所で行い、各画面はその結果に従います。
さらに搭載
| 内容 | |
|---|---|
| 管理コンソール 8 画面 | Dashboard / Members / Approvals / Plans / Billing / API・MCP / Audit log / Security |
| REST API | 発行したキーが「どのアプリを操作できるか」まで決まる |
| MCP サーバー | 9 つのツールを stdio で提供。AI から会員基盤を操作できる |
| マルチテナント | テナント → アプリケーション → 会員の 3 階層。全クエリがスコープ必須 |
| 二段階認証 | 認証アプリ(TOTP / RFC 6238)と SMS から選択。管理者は既定で必須 |
| 監査ログ | すべての管理操作を記録。AI 経由の変更も対象 |
機能は削っていません。 動いているものが、そのまま入っています。
権限は保存せず、毎回プランから導出する
memberkit は Role は保存しますが、Permission は保存しません。
プランから権限を毎回計算するため、プランが変われば権限も同時に変わります。結果として、「取り消し忘れた古い権限」が残る場所そのものがありません。
契約状態から権限への変換は独立したモジュールに切り出し、全分岐をテストしています。ここが会員基盤の中で最も事故が高くつく場所だからです。
そして、承認待ちの会員は Google ログインに成功していてもアプリケーションには入れません。 アクセスできるかどうかは、認証の成否ではなく会員状態から決まります。
「うまくいく」だけでなく、「突破されない」も検証
| 件数 | 内容 | |
|---|---|---|
| E2E | 77 | Firebase エミュレータ上の実アプリに対する攻撃シナリオ |
| 単体 | 123 | 権限導出・状態遷移・TOTP・暗号・テナント境界・webhook 署名ほか |
E2E が確認しているのは「動くこと」より、攻撃者が試すことが失敗することです。
- 一般会員による管理 API の呼び出し
- 未承認の状態での決済
- ログアウト後の Cookie 再利用
- 他テナントの ID での読み取り・書き込み
- ヘッダ(X-Forwarded-For)詐称によるレート制限逃れ
- 二段階認証の通過証明を別セッションへ転用
- 失効済み API キーの再利用
実装済みの防御(抜粋)
| 項目 | 内容 |
|---|---|
| セッション | httpOnly Cookie。ID トークンをブラウザに保持しない |
| 認可 | 全ページ・全 API でサーバ側再検証。middleware は認可の境界にしない |
| 決済 | 価格はサーバが解決。クライアントは金額も price ID も送れない |
| Webhook | 署名検証 + イベント ID による冪等化。偽造・改竄・リプレイを拒否 |
| テナント分離 | 全クエリがスコープ必須(型で強制)。他テナントの ID は「存在しないもの」として扱う |
| MFA シークレット | AES-256-GCM で封緘して保存。リカバリコードはハッシュのみ |
| CSP | リクエストごとの nonce + strict-dynamic |
| MCP スコープ | 個人情報・決済・シークレット系の権限は API / MCP キーに付与できない |
会員機能を、最初から作り直さない
SaaS・会員制サービス・社内アプリの会員基盤として、そのままお使いいただけます。
評価は 1 コマンドです。Firebase のプロジェクトも Stripe のアカウントも作らずに、登録からメール認証、管理者承認、プラン契約、二段階認証、管理コンソールまで一通り触れます。
docker compose up --build # → http://localhost:3000
まずはリポジトリをご覧ください。
https://github.com/nup-cloud/memberkit
導入効果(モデルケース試算)
以下は、会員基盤を自前で実装している一般的な体制を想定した当社による試算です。実在の導入事例の実績値ではなく、成果を保証するものではありません。
開発・運用にかかっていた時間
| 項目 | 自前実装(想定) | memberkit |
|---|---|---|
| 会員基盤の初期構築 | 8〜12 週 | 評価環境は 1 コマンド。本番設定に 2〜3 週 |
| 権限の付け替え・棚卸し | 月 20 時間 | プランから毎回導出するため作業が発生しない |
| 入会承認のリードタイム | 2 営業日 | 4 時間(承認待ちが 1 画面に集まる) |
| 監査・セキュリティチェック対応 | 都度 3〜5 日 | 監査ログと検証項目の一覧をそのまま提出 |
空いた時間は、通常営業に戻せます。 会員基盤は差別化になりにくい一方、作り込みと事故対応に時間を持っていかれる領域です。
数字が見えると、売上が動く
会員状態・プラン・承認・監査ログが 1 箇所に揃うため、どこで人が止まっているかが数字で見えます。
月間 1,000 件の新規登録があるサービスの試算です。
| 段階 | 導入前 | 滞留を可視化して手を打った後 |
|---|---|---|
| 新規登録 | 1,000 | 1,000 |
| メール認証の完了 | 780 | 860 |
| 承認まで到達 | 640 | 790 |
| 有料プラン契約 | 192 | 245 |
月額 5,000 円のプランであれば、月次で +26.5 万円、年間で +318 万円の増収に相当します(+27.6%)。
内訳は特別なことではありません。「メール認証で 220 件落ちている」「承認待ちが 140 件滞留している」が見えたから、リマインドと承認 SLA を直した、というだけです。見えなければ、この 2 つは着手されません。
ホスティング版(SaaS)もご用意しています
自己ホストは、機能が削られていない代わりに運用が付いてきます。
- Firebase / Identity Platform のプロジェクト運用と承認済みドメイン管理
- 暗号鍵・サービスアカウント鍵・Stripe キーの保管とローテーション
- Stripe webhook の常時受信
- WAF / DDoS 対策と、オリジンへの直アクセス遮断
- メールの到達率(SPF / DKIM / DMARC)
- 稼働・エラー・不正試行の監視、依存の脆弱性対応
この一覧を持ちたくない場合は、ホスティング版(SaaS)が向いています。 上記の運用は当社が引き受け、お客様は会員基盤としての機能だけをお使いいただけます。専有環境・SLA・優先サポートを含む構成もご相談を承ります。
| 項目 | 内容 |
|---|---|
| 提供形態 | 当社が運用するホスティング版 / 専有環境 |
| 価格 | 個別お見積り(会員数・要件をうかがって概算をご提示します) |
| 導入支援 | 既存の会員データからの移行、SSO・監査要件の設定 |
| お問い合わせ | https://nupwhite.com/contact |
ライセンス
AGPL-3.0 です。自己ホストして商用にお使いいただけます。
改変してネットワーク越しにサービスとして提供する場合、AGPL は改変後のソースの公開を求めます。それが難しい場合のために、商用ライセンスを用意しています。なお、自分の API を叩くだけの利用は AGPL の対象外です。
技術構成
| 項目 | 内容 |
|---|---|
| アプリケーション | Next.js 16 / React 19 / TypeScript |
| 認証・データベース | Firebase Authentication / Firestore |
| 決済 | Stripe Checkout / Customer Portal / Webhook(Stripe Connect 対応) |
| 連携 | REST API / MCP サーバー(9 ツール) |
| ライセンス | AGPL-3.0(商用ライセンスあり) |
| リポジトリ | https://github.com/nup-cloud/memberkit |
会社概要
| 項目 | 内容 |
|---|---|
| 会社名 | 株式会社NUP WHITE |
| 所在地 | 東京都中央区晴海3-10-1 Daiwa晴海 2F |
| 事業内容 | データ基盤・AI基盤の開発/AI駆動開発による技術支援 |
| URL | https://nupwhite.com |
本件に関するお問い合わせ
memberkit の導入相談、ホスティング版(SaaS)のお見積り、商用ライセンスのご相談を承っております。資料のご送付、セキュリティチェックシートへのご記入、秘密保持契約の締結にも対応いたします。
株式会社NUP WHITE リポジトリ:https://github.com/nup-cloud/memberkit お問い合わせフォーム(https://nupwhite.com/contact)