Skip to content

Discord の OAuth2 API を利用して OpenID Connect を確立します.

License

Notifications You must be signed in to change notification settings

approvers/members-auth

 
 

Repository files navigation

限界開発鯖 OpenID Connect システム

利用者が正当な限界開発鯖のメンバー (かつ適切なロールを保持したメンバー) であることを簡便に認証できます.

Discord の OAuth2 API を利用して OpenID Connect を確立します. Hono を用いて構築されており, Cloudflare Workers + KV にデプロイしています.

利用方法

この認証情報は Cloudflare Zero Trust システム全体で認証情報プロバイダ "Discord OAuth2" (私が追加したもの) を通じて利用できます. ウェブサイトや API のトンネリングやアクセス制限などできることが多いので, 詳しくは 公式ドキュメント をご覧ください.

OpenID Connect クレーム

この認証情報の JWT には, OpenID Connect クレームとして以下の情報が付加されています. Cloudflare Zero Trust 上では以下のクレームを用いたポリシーを構築可能です.

クレーム名 形式 説明
id string Discord アカウントの ID.
username string Discord アカウントのユーザー名.
discriminator string Discord ユーザー名の # 以降の部分. ユーザー名移行プロセス を行っていればこれは "0" になります.
roles:${guildId} string[] guildId の ID のサーバにおけるロール ID リスト.

内部仕様

API エンドポイント

Open ID Connect のプロバイダの基準を満たすように, 以下のエンドポイントを提供しています. Cloudflare Zero Trust 上に "Discord OAuth2" という名前で設定しており, ダッシュボードの設定 の "Authentication" の項目からテストや編集が行なえます (要権限).

  • GET /authorize - ブラウザからここにアクセスすると, Discord の認証画面にリダイレクトされて認証スキームが始まります.
    • クエリパラメータ
      • state - OAuth 認可スキームの間保持され続ける状態の文字列です. CSRF を防ぐために, これに予測不可能な文字列を渡して, ログイン処理後も同じ state が返されることを確認すべきです (SHOULD).
  • POST /token - OAuth トークンエンドポイントです. Discord OAuth API の認可トークンを受け取り, アクセストークンと JWT を発行します.
  • GET /jwks.json - 鍵チェーン情報を返します.

プロジェクト構造

このプロジェクトのソースコード /src は, 以下のようなディレクトリ構造を取っています.

  • adaptor - service のコードが要求する interface を実装したクラスや関数です.
    • discord.ts - Discord の API と直接やり取りします.
    • in-memory.ts - デバッグなどのためのインメモリデータベースです.
    • kv.ts - Cloudflare KV と接続したデータベースです.
  • service
    • key.ts - 公開鍵暗号の鍵ペアを取得/生成します.
    • token.ts - 認証情報を備えたトークンを生成します.
  • consts.ts - システム全体で用いる定数をいくつかハードコードして格納しています.
  • main.ts - システムのエントリポイントです.

About

Discord の OAuth2 API を利用して OpenID Connect を確立します.

Resources

License

Stars

Watchers

Forks

Languages

  • TypeScript 93.1%
  • JavaScript 6.9%