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ロールの一時的なユーザーレコードを作成します。
相互運用性とCORS
Bedrudは複数のオリジンからのアクセスが可能に設計されています。これは開発時(React開発サーバー)と本番環境(異なるサブドメイン)の両方で重要です。
- CORSポリシー:
config.yamlで定義されます。OAuthおよびパスキーセレモニーで使用されるセッションクッキーに必要なAllowCredentials: trueをサポートしています。 - 許可されたオリジン: デフォルトでは、サーバー自身のドメインと
localhost:3000(React開発サーバーのポート)を許可しています。
ユーザーロール(アクセス制御)
各ユーザーは「accesses」(ロール)のリストを持っています。
user: 標準ユーザー。ルームに参加し、ルームを作成できます。guest: 一時ユーザー。ルームに参加できます。superadmin:/adminダッシュボードを通じて全ユーザーとルームを管理できます。
middleware.RequireAccess("superadmin")ガードが管理者ルートを保護しています。