利用者が正当な限界開発鯖のメンバー (かつ適切なロールを保持したメンバー) であることを簡便に認証できます.
Discord の OAuth2 API を利用して OpenID Connect を確立します. Hono を用いて構築されており, Cloudflare Workers + KV にデプロイしています.
この認証情報は Cloudflare Zero Trust システム全体で認証情報プロバイダ "Discord OAuth2" (私が追加したもの) を通じて利用できます. ウェブサイトや API のトンネリングやアクセス制限などできることが多いので, 詳しくは 公式ドキュメント をご覧ください.
この認証情報の JWT には, OpenID Connect クレームとして以下の情報が付加されています. Cloudflare Zero Trust 上では以下のクレームを用いたポリシーを構築可能です.
| クレーム名 | 形式 | 説明 |
|---|---|---|
id |
string |
Discord アカウントの ID. |
username |
string |
Discord アカウントのユーザー名. |
discriminator |
string |
Discord ユーザー名の # 以降の部分. ユーザー名移行プロセス を行っていればこれは "0" になります. |
roles:${guildId} |
string[] |
guildId の ID のサーバにおけるロール ID リスト. |
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 と接続したデータベースです.
servicekey.ts- 公開鍵暗号の鍵ペアを取得/生成します.token.ts- 認証情報を備えたトークンを生成します.
consts.ts- システム全体で用いる定数をいくつかハードコードして格納しています.main.ts- システムのエントリポイントです.