Bedrud ドキュメント

Bedrudは複数の認証方式をサポートしています。

JWT (JSON Web Tokens)

Bedrudはセッション管理にJWTを使用しています。ログイン時に、サーバーは2つのトークンを返します:

  1. Access Token: 短命(例: 1時間)。保護されたAPIエンドポイントへのアクセスに使用されます。
  2. 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ライブラリを使用して以下をサポートしています:

  • Google
  • GitHub
  • Twitter

これらを有効にするには、config.yamlauth:セクションにClient IDとAPI Secretを入力します。

3. パスキー (WebAuthn/FIDO2)

BedrudはFIDO2標準(WebAuthn)によるパスワードレス認証をサポートしています。

  • 登録セレモニー:
    1. 開始: サーバーは暗号学的に安全なチャレンジを生成し、ユーザーのセッションに保存します。
    2. 完了: クライアントのオーセンティケーター(例: TouchID、YubiKey)がチャレンジに署名します。サーバーはアテステーションを検証し、公開鍵を抽出してpasskeysテーブルに保存します。
  • 認証セレモニー:
    1. 開始: サーバーは新しいチャレンジを発行します。
    2. 完了: クライアントは秘密鍵でチャレンジに署名します。サーバーはデータベースから公開鍵を取得し、署名を検証してサインカウンターを確認します。
  • セキュリティ: Counterフィールドの照合によりリプレイアタックを防ぎます。オーセンティケーターのカウンターが保存されたカウンター以上でない場合、ログインは拒否されます。

4. ゲストログイン

ユーザーが名前を入力するだけでミーティングに即座に参加できるようにします。サーバーはguestロールの一時的なユーザーレコードを作成します。

相互運用性とCORS

Bedrudは複数のオリジンからのアクセスが可能に設計されています。これは開発時(React開発サーバー)と本番環境(異なるサブドメイン)の両方で重要です。

  • CORSポリシー: config.yamlで定義されます。OAuthおよびパスキーセレモニーで使用されるセッションクッキーに必要なAllowCredentials: trueをサポートしています。
  • 許可されたオリジン: デフォルトでは、サーバー自身のドメインとlocalhost:3000(React開発サーバーのポート)を許可しています。

ユーザーロール(アクセス制御)

各ユーザーは「accesses」(ロール)のリストを持っています。

  • user: 標準ユーザー。ルームに参加し、ルームを作成できます。
  • guest: 一時ユーザー。ルームに参加できます。
  • superadmin: /adminダッシュボードを通じて全ユーザーとルームを管理できます。

middleware.RequireAccess("superadmin")ガードが管理者ルートを保護しています。