汎用認証・認可サーバー。Clean Architecture で構築された Go 製の認証基盤。
- メール + パスワード認証 — 登録・ログイン・ログアウト・メール検証・パスワードリセット
- JWT トークン管理 — ES256/RS256、リフレッシュトークンローテーション、ファミリー検出
- MFA — TOTP (Google Authenticator 等)、リカバリーコード
- OAuth 2.0 — Authorization Code + PKCE、Client Credentials、イントロスペクション
- OpenID Connect — ID Token、UserInfo、Discovery (
/.well-known/openid-configuration)、JWKS - RBAC — 階層ロール・パーミッション、Redis キャッシュ、認可ミドルウェア
- ソーシャルログイン — Google、GitHub (アカウント自動リンク)
- Admin API — ユーザー管理、クライアント管理、ロール/パーミッション管理、監査ログ
- セキュリティ — レートリミット (Sliding Window)、HTTPS 強制、JTI リプレイ防止
| カテゴリ | ライブラリ |
|---|---|
| HTTP | Chi |
| DB | PostgreSQL (pgx/v5 + sqlx) |
| キャッシュ | Redis (go-redis/v9) |
| JWT | golang-jwt/jwt/v5 (ES256) |
| パスワード | argon2id (PHC 形式) |
| MFA | pquerna/otp |
| マイグレーション | golang-migrate/migrate/v4 |
| 設定 | caarlos0/env/v11 |
| ログ | log/slog |
| メトリクス | prometheus/client_golang |
- Go 1.25+
- Docker / Docker Compose
# リポジトリ取得
git clone https://github.com/HMasataka/gate
cd gate
# 環境変数設定
cp .env.example .env
# PostgreSQL + Redis + Gate を起動
docker compose upgo mod tidy
go build -o gate ./cmd/gate
./gate環境変数で設定します。.env.example を参照してください。
主要な設定項目:
| 環境変数 | 説明 | デフォルト |
|---|---|---|
DATABASE_URL |
PostgreSQL 接続 URL | — |
REDIS_URL |
Redis 接続 URL | — |
JWT_ALGORITHM |
JWT 署名アルゴリズム | ES256 |
JWT_PRIVATE_KEY_PATH |
PEM 秘密鍵パス (省略時は開発用鍵を自動生成) | — |
ACCESS_TOKEN_EXPIRY |
アクセストークン有効期限 | 15m |
REFRESH_TOKEN_EXPIRY |
リフレッシュトークン有効期限 | 168h |
SESSION_MAX_CONCURRENT |
同時セッション数上限 | 5 |
MFA_RECOVERY_CODE_COUNT |
リカバリーコード生成数 | 8 |
GOOGLE_CLIENT_ID |
Google OAuth クライアント ID | — |
GITHUB_CLIENT_ID |
GitHub OAuth クライアント ID | — |
HTTPS_REDIRECT |
HTTPS リダイレクト有効化 | false |
| メソッド | パス | 説明 |
|---|---|---|
| POST | /api/v1/auth/register |
ユーザー登録 |
| POST | /api/v1/auth/login |
ログイン (JWT + セッション発行) |
| POST | /api/v1/auth/logout |
ログアウト |
| POST | /api/v1/auth/verify-email |
メール検証 |
| POST | /api/v1/auth/forgot-password |
パスワードリセットメール送信 |
| POST | /api/v1/auth/reset-password |
パスワードリセット |
| POST | /api/v1/auth/change-password |
パスワード変更 (JWT 必須) |
| メソッド | パス | 説明 |
|---|---|---|
| POST | /api/v1/mfa/totp/setup |
TOTP セットアップ |
| POST | /api/v1/mfa/totp/confirm |
TOTP 有効化 |
| DELETE | /api/v1/mfa/totp |
TOTP 無効化 |
| POST | /api/v1/mfa/recovery-codes/regenerate |
リカバリーコード再生成 |
| メソッド | パス | 説明 |
|---|---|---|
| GET | /api/v1/oauth/authorize |
認可エンドポイント |
| POST | /oauth/token |
トークン取得 (code / refresh_token / client_credentials) |
| POST | /oauth/revoke |
トークン失効 |
| POST | /oauth/introspect |
トークンイントロスペクション |
| GET | /oauth/userinfo |
UserInfo (JWT 必須) |
| GET | /.well-known/openid-configuration |
OIDC Discovery |
| GET | /.well-known/jwks.json |
JWKS |
| メソッド | パス | 説明 |
|---|---|---|
| GET | /api/v1/auth/social/{provider}/authorize |
認可 URL へリダイレクト |
| GET | /api/v1/auth/social/{provider}/callback |
コールバック処理 |
{provider}: google / github
| メソッド | パス | 説明 |
|---|---|---|
| GET | /health |
Liveness |
| GET | /ready |
Readiness (DB + Redis 接続確認) |
| GET | /metrics |
Prometheus メトリクス |
詳細は api/openapi.yaml を参照してください。
gate は 3 つの React (Vite) フロントエンドアプリを提供します。
| アプリ | ディレクトリ | 用途 |
|---|---|---|
| Portal | web/portal/ |
一般ユーザー用 — ログイン・登録・ダッシュボード・OAuth クライアント管理 |
| Admin | web/admin/ |
gate 管理者用 — ユーザー管理・クライアント管理・ロール/パーミッション・監査ログ |
| Sample App | web/sample-app/ |
OAuth 2.0 PKCE フローのデモアプリ |
# API サーバー起動
docker compose up
# 各アプリを起動(別ターミナルで)
cd web/portal && pnpm install && pnpm dev
cd web/admin && pnpm install && pnpm dev
cd web/sample-app && pnpm install && pnpm dev各アプリの API 呼び出しは Vite の proxy 設定で localhost:8080 に自動転送されます。
Sample App は gate の OAuth 2.0 Authorization Code + PKCE フローを体験するためのデモアプリです。Google ログインと同じ標準的な認可フローを再現します。
Portal (http://localhost:5173/portal/register) でユーザーを登録し、ログインします。
Portal の「My Applications」→「Register New」でクライアントを登録します。
| 項目 | 値 |
|---|---|
| Name | 任意(例: Sample App) |
| Client Type | public |
| Redirect URI | http://localhost:<sample-appのポート>/sample-app/callback |
| Scopes | openid, email |
| Grant Types | authorization_code |
登録後に表示される Client ID をコピーしてください。
Sample App (http://localhost:<ポート>/sample-app/) を開き、Client ID を入力して「Login with gate」をクリックします。
- gate の認可エンドポイントにリダイレクトされます
- gate のログイン画面が表示されるので、手順 1 で登録した email/password でログインします
- ログイン成功後、認可コードが発行され Sample App に戻ります
- Sample App がトークン交換を行い、ダッシュボードにユーザー情報が表示されます
Clean Architecture に基づく 4 レイヤー構成。依存方向は外側から内側のみ。
cmd/gate/main.go エントリポイント・手動 DI
internal/domain/ エンティティ・インターフェース (外部依存なし)
internal/usecase/ ビジネスロジック
internal/handler/ HTTP ハンドラ
internal/middleware/ ミドルウェア
internal/infra/postgres/ PostgreSQL 実装
internal/infra/redis/ Redis 実装
internal/infra/crypto/ argon2id・JWT・乱数
internal/infra/social/ ソーシャルログインプロバイダ
internal/infra/mailer/ メーラー (stdout 実装)
internal/config/ 設定構造体
migrations/ SQL マイグレーション
api/ OpenAPI 仕様
MIT