利用者が正当な限界開発鯖のメンバー (かつ適切なロールを保持したメンバー) であることを簡便に認証できます.
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 と接続したデータベースです.
service
key.ts
- 公開鍵暗号の鍵ペアを取得/生成します.token.ts
- 認証情報を備えたトークンを生成します.
consts.ts
- システム全体で用いる定数をいくつかハードコードして格納しています.main.ts
- システムのエントリポイントです.