Closed6

100日チャレンジ day59(OIDC Provider)

riddle_tecriddle_tec

昨日
https://zenn.dev/gin_nazo/scraps/01ce587b6d51ed


https://blog.framinal.life/entry/2025/04/14/154104

100日チャレンジに感化されたので、アレンジして自分でもやってみます。

やりたいこと

  • 世の中のさまざまなドメインの簡易実装をつくり、バックエンドの実装に慣れる(dbスキーマ設計や、関数の分割、使いやすいインターフェイスの切り方に慣れる
  • 設計力(これはシステムのオーバービューを先に自分で作ってaiに依頼できるようにする
  • 生成aiをつかったバイブコーティングになれる
  • 実際にやったことはzennのスクラップにまとめ、成果はzennのブログにまとめる(アプリ自体の公開は必須ではないかコードはgithubにおく)

できたもの

https://github.com/lirlia/100day_challenge_backend/tree/main/day59_oauth_provider

riddle_tecriddle_tec

了解しました!Go言語でOAuth2/OpenID Connect Provider APIを実装しましょう。

🔐 Day59 - OAuth2/OpenID Connect Provider (Go API)

実装方針

  • Go言語でOIDC Provider APIサーバーを構築
  • RESTful APIでOAuth2/OpenID Connectエンドポイントを提供
  • SQLiteでクライアント・ユーザー・トークン管理
  • JWTによる署名・検証(RS256)
  • Web UIは最小限のテスト・管理画面のみ

主要API エンドポイント

OAuth2/OpenID Connect標準エンドポイント

GET  /.well-known/openid_configuration  # Discovery
GET  /.well-known/jwks.json             # JSON Web Key Set
GET  /authorize                         # Authorization endpoint
POST /token                             # Token endpoint  
GET  /userinfo                          # UserInfo endpoint

管理API

POST /api/clients                       # OAuth2クライアント作成
GET  /api/clients                       # クライアント一覧
PUT  /api/clients/{id}                  # クライアント更新
DELETE /api/clients/{id}                # クライアント削除

POST /api/users                         # ユーザー作成
GET  /api/users                         # ユーザー一覧
POST /api/users/login                   # ユーザーログイン

GET  /api/tokens                        # 発行済みトークン一覧
DELETE /api/tokens/{id}                 # トークン失効

テスト用API

GET  /test/client                       # OIDCクライアントシミュレーター
POST /test/validate-token               # トークン検証

対応するOAuth2フロー

  1. Authorization Code Flow - 標準的なWebアプリ向け
  2. Authorization Code Flow with PKCE - SPA・モバイル向け
  3. Client Credentials Flow - サーバー間通信
  4. OpenID Connect - 認証情報付き

Go 技術スタック

  • HTTP Router: gorilla/mux または標準 net/http
  • JWT: golang-jwt/jwt/v5
  • Database: database/sql + modernc.org/sqlite
  • Crypto: 標準ライブラリ crypto/rsa, crypto/rand
  • HTML Template: html/template(管理画面用)
  • UUID: google/uuid

プロジェクト構成

day59_oauth_provider/
├── main.go
├── go.mod
├── go.sum
├── internal/
│   ├── handlers/          # HTTPハンドラー
│   │   ├── oauth.go       # OAuth2エンドポイント
│   │   ├── oidc.go        # OpenID Connectエンドポイント
│   │   ├── admin.go       # 管理API
│   │   └── test.go        # テスト用API
│   ├── models/            # データモデル
│   │   ├── client.go
│   │   ├── user.go
│   │   ├── token.go
│   │   └── authcode.go
│   ├── services/          # ビジネスロジック
│   │   ├── oauth.go       # OAuth2サービス
│   │   ├── jwt.go         # JWT生成・検証
│   │   └── crypto.go      # 暗号化処理
│   └── database/          # DB関連
│       ├── db.go
│       └── migrations.go
├── web/                   # 静的ファイル・テンプレート
│   ├── templates/
│   │   ├── login.html
│   │   ├── consent.html
│   │   └── admin.html
│   └── static/
└── README.md

主要機能詳細

1. OAuth2 Authorization Code Flow

1. クライアント → /authorize (認可リクエスト)
2. ユーザー認証 → ログイン画面
3. ユーザー同意 → 同意画面  
4. 認可コード発行 → redirect_uri にコード返却
5. クライアント → /token (トークンリクエスト)
6. アクセストークン + IDトークン発行

2. JWT トークン仕様

// アクセストークン
{
  "iss": "http://localhost:8080",
  "sub": "user123",
  "aud": "client456", 
  "exp": 1640995200,
  "iat": 1640991600,
  "scope": "openid profile email"
}

// IDトークン (OpenID Connect)
{
  "iss": "http://localhost:8080",
  "sub": "user123",
  "aud": "client456",
  "exp": 1640995200, 
  "iat": 1640991600,
  "email": "user@example.com",
  "name": "Test User"
}

3. PKCE対応

  • Code Challenge/Verifier生成・検証
  • code_challenge_method: S256
  • SHA256ハッシュによる検証

セキュリティ対策

  • RSA鍵ペア生成(2048bit)
  • CSRF保護(state parameter)
  • PKCE対応(公開クライアント向け)
  • トークン有効期限管理
  • Secure Cookie設定

この仕様でGo実装を開始してよろしいでしょうか?

  1. はい、Go APIで実装を開始してください
  2. 特定の技術スタックを変更したい
  3. 機能範囲を調整したい
このスクラップは1ヶ月前にクローズされました