Bedrudは複数の認証方式をサポートしています。
JWT (JSON Web Tokens)
Bedrudはセッション管理にJWTを使用しています。ログイン時に、サーバーは2つのトークンを返します:
- Access Token: 短命(例: 1時間)。保護されたAPIエンドポイントへのアクセスに使用されます。
- Refresh Token: 長命(例: 30日間)。再度ログインすることなく新しいAccess Tokenを取得するために使用されます。
これらのトークンの検証は、internal/middleware/auth.goファイルで行われます。
トークン管理とセキュリティ
1. トークンペア戦略(ローテーション)
Bedrudは安全なトークンローテーション戦略を採用しています。ユーザーが認証されると、以下のトークンが発行されます:
- Access Token: HS256で署名され、ユーザーID、名前、権限を含みます。短い期間有効です(
tokenDurationで設定可能)。 - Refresh Token: 別の長命トークン。
ローテーション: Access Tokenの有効期限が切れると、クライアントはRefresh Tokenを/api/auth/refreshに送信します。サーバーは新しいペアのトークンを発行し、データベースに保存されているリフレッシュトークンを更新します。これにより、トークンが盗まれた場合でも脆弱な期間を限定できます。
2. トークンの失効(ブラックリスト化)
安全なログアウトをサポートするため、Bedrudはトークンブラックリストを実装しています。
- ユーザーがログアウトすると、現在のRefresh Tokenが
blocked_refresh_tokensテーブルに追加されます。 - セッションを更新する前に、サーバーはこのテーブルを確認します。トークンがブロックされている場合、リクエストは直ちに拒否されます。
- バックグラウンドタスク(Scheduler)が、これらのブロックされたトークンの自然な有効期限後に自動的にクリーンアップするように設計されています。
3. JWT Claims構造
トークンは、バックエンドとフロントエンドがデータベースへのアクセスなしで迅速な判断を下せるようにするメタデータを保持しています:
{
"userId": "uuid-string",
"email": "user@example.com",
"name": "Display Name",
"accesses": ["user", "admin"],
"exp": 123456789,
"iat": 123456780
}認証方式
1. ローカルメール・パスワード認証
- パスワードはbcryptでハッシュ化されます - プレーンテキストで保存されることはありません。
- 登録時に、データベースに新しいUserレコードが作成されます。
2. ソーシャルログイン (OAuth2)
BedrudはGothライブラリを使用して以下をサポートしています:
- GitHub
これらを有効にするには、config.yamlのauth:セクションにClient IDとAPI Secretを入力します。
3. パスキー (WebAuthn/FIDO2)
BedrudはFIDO2標準(WebAuthn)によるパスワードレス認証をサポートしています。
- 登録セレモニー:
- 開始: サーバーは暗号学的に安全なチャレンジを生成し、ユーザーのセッションに保存します。
- 完了: クライアントのオーセンティケーター(例: TouchID、YubiKey)がチャレンジに署名します。サーバーはアテステーションを検証し、公開鍵を抽出して
passkeysテーブルに保存します。
- 認証セレモニー:
- 開始: サーバーは新しいチャレンジを発行します。
- 完了: クライアントは秘密鍵でチャレンジに署名します。サーバーはデータベースから公開鍵を取得し、署名を検証してサインカウンターを確認します。
- セキュリティ:
Counterフィールドの照合によりリプレイアタックを防ぎます。オーセンティケーターのカウンターが保存されたカウンター以上でない場合、ログインは拒否されます。
4. ゲストログイン
ユーザーが名前を入力するだけでミーティングに即座に参加できるようにします。サーバーはguestロールの一時的なユーザーレコードを作成します。
メール確認
設定で requireEmailVerification: true の場合、ローカル(OAuth以外)の登録とログインにはメール確認が必要です:
- 登録 はユーザーを作成しますが
EmailVerifiedAtをnilに設定します。確認が完了するまでログインできません。 - ログイン は未確認アカウントに対して
403と{"requiresVerification": true}を返します。 - 再送信 は
POST /api/auth/verify/resend経由 —verificationEmailCooldownMinsと別のレート制限バケット(authResendMaxRequests)によって制限されます。 - 自動クリーンアップ は
unverifiedAccountTTLHours(デフォルト48時間、0で無効)後に未確認アカウントを削除します。 - メールアドレス変更 は新しい確認フローをトリガーします。ユーザーはログインしたままになり、新しいトークンが発行されます。
ゲストユーザーは対象外です — メールアドレスを持ちません。
パスワードリセット
パスワードリセットフロー(SMTPが必要):
POST /api/auth/forgot-passwordに{"email": "..."}— サーバーがメールにリセットリンクを送信POST /api/auth/reset-passwordに{"token": "...", "newPassword": "..."}— 新しいパスワードを設定
リセットトークンのTTLは resetTokenTTLHours(デフォルト1時間)で制御されます。forgot-password エンドポイントは認証レート制限バケットを共有します。
クールダウン & レート制限
Bedrudは4つの独立したレート制限バケットを使用します:
| バケット | エンドポイント | デフォルト | ウィンドウ |
|---|---|---|---|
| Auth | login, register, refresh, passkey, forgot-password | 10 | 60s |
| ゲスト | guest-login | 5 | 60s |
| API | 一般API | 30 | 60s |
| 再送信 | verify/resend | 3 | 60s |
バケットを 0 に設定 = 無効。すべての制限はリモートIP単位です。超過したリクエストは 429 Too Many Requests と Retry-After ヘッダーを返します。
相互運用性とCORS
Bedrudは複数のオリジンからのアクセスが可能に設計されています。これは開発時(React開発サーバー)と本番環境(異なるサブドメイン)の両方で重要です。
- CORSポリシー:
config.yamlで定義されます。OAuthおよびパスキーセレモニーで使用されるセッションクッキーに必要なAllowCredentials: trueをサポートしています。 - 許可されたオリジン: デフォルトでは、サーバー自身のドメインと
localhost:3000(React開発サーバーのポート)を許可しています。
ユーザーロール(アクセス制御)
各ユーザーは accesses 配列を持ち、複数のアクセスレベルを同時に保持できます。JWTクレームには完全な accesses 配列が含まれ、ミドルウェアが詳細な権限チェックを行えます。
アクセスレベル
| アクセスレベル | スコープ | 権限 |
|---|---|---|
superadmin | システム全体 | 管理ダッシュボード (/dashboard/admin)、すべての管理APIエンドポイント (/api/admin/*)、ユーザー管理、ルーム管理、システム設定、招待トークンへのフルアクセス。すべてのルームモデレーション操作のグローバルバイパスとして機能。RequireAccess("superadmin") ミドルウェアで保護。 |
admin | 定義済み(未強制) | accesses 配列で利用可能ですが、現在どのミドルウェアでも使用されていません。情報提供のみ。将来のロールベースアクセス制御機能用に予約。 |
moderator | ルームスコープ | 特定のルームをモデレーション可能: チャットブロック、参加者のミュート/ミュート解除、スポットライト、画面共有停止、ビデオ無効化。通話中にルーム作成者またはsuperadminが PromoteParticipant で昇格。isRoomModerator() ヘルパーでチェック。 |
user | 標準 | すべての登録のデフォルト。ルームの作成、ルームへの参加、プロフィール管理、自身のパスキー管理が可能。Protected() ミドルウェアで保護。 |
guest | 制限付き | ゲストログインによる公開ルーム参加用の一時ユーザー。ルームの作成や保護された機能へのアクセスは不可。 |
ロール階層
superadmin > admin > moderator > user > guest
superadmin はルームモデレーターとして昇格されていなくても、任意のルームで任意のモデレーション操作を実行できます。ルーム作成者は自動的にルーム管理者となり、参加者をモデレーターに昇格できます。
ロールの割り当て
ロールは複数のチャネルを通じて管理されます:
- CLI:
bedrud user create(userとして作成)、bedrud user promote(superadminを追加)、bedrud user demote(superadminを削除) - 管理ダッシュボード: ユーザー詳細ページに昇格/降格ボタン
- 管理者API:
PUT /api/admin/users/:id/accessesで希望するaccesses配列を指定 - 会議中: ルーム作成者が参加者をルームレベルのモデレーターに昇格可能
注意: 最初のsuperadminを作成するAPIエンドポイントやWeb UIはありません。インストール後、CLI(
bedrud user create+bedrud user promote)を使用して初回管理者アクセスをブートストラップする必要があります。これは意図的なセキュリティ対策です。