Go Academy · レッスン

Ginミドルウェア:認証とロギング

Ginミドルウェアを作成して登録します。

レッスン 4/413 ステップ

「Ginミドルウェア:認証とロギング」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

Ginミドルウェアのシグネチャ

Ginのミドルウェアはgin.HandlerFuncであり、c.Next()を呼び出して次のハンドラーに制御を渡すか、c.Abort()を呼び出してチェーンを停止します。

func MyMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // before handler
        c.Next()
        // after handler
    }
}

ミドルウェアをグローバルに適用する

r.Useを使用すると、すべてのルートにミドルウェアを適用できます。

r := gin.New()
r.Use(gin.Logger())
r.Use(gin.Recovery())

ロギングミドルウェア

Gin組み込みのgin.Logger()は、メソッド、パス、ステータス、レイテンシを記録します。構造化ロギングを行う場合は、zapまたはslogを使用するカスタムミドルウェアに置き換えます。

func ZapLogger(logger *zap.Logger) gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now()
        c.Next()
        logger.Info("request",
            zap.String("method", c.Request.Method),
            zap.String("path", c.FullPath()),
            zap.Int("status", c.Writer.Status()),
            zap.Duration("latency", time.Since(start)),
        )
    }
}

認証ミドルウェア

ミドルウェアでJWTまたはAPIキーを検証し、無効な場合は401で処理を中断します。

func AuthRequired() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("Authorization")
        claims, err := validateJWT(token)
        if err != nil {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
            return
        }
        c.Set("user", claims)
        c.Next()
    }
}

コンテキスト経由でデータを渡す

c.Set("key", value)でデータを保存し、c.Get("key")またはc.MustGetなどの型付きヘルパーでハンドラーから取得します。

user, _ := c.Get("user")
claims := user.(*Claims)

リカバリーミドルウェア

gin.Recovery()はパニックを捕捉し、500レスポンスを返します。スタックトレースを記録したり、エラートラッキングサービスに送信したりするようカスタマイズできます。

r.Use(gin.CustomRecovery(func(c *gin.Context, recovered any) {
    log.Printf("panic: %v", recovered)
    c.AbortWithStatusJSON(500, gin.H{"error": "internal server error"})
}))

CORSミドルウェア

github.com/gin-contrib/corsを使用してCORSヘッダーを追加します。

r.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"https://example.com"},
    AllowMethods:     []string{"GET", "POST", "PUT"},
    AllowHeaders:     []string{"Authorization", "Content-Type"},
    AllowCredentials: true,
}))

レート制限ミドルウェア

ミドルウェア内でgolang.org/x/time/rateを使用し、IPごとにトークンバケットを設けてリクエストレートを制限します。

リクエストIDミドルウェア

リクエストごとに一意のリクエストIDを生成し、コンテキストとレスポンスヘッダーに追加します。

func RequestID() gin.HandlerFunc {
    return func(c *gin.Context) {
        id := uuid.New().String()
        c.Set("requestID", id)
        c.Header("X-Request-ID", id)
        c.Next()
    }
}

グループ単位のミドルウェア

ミドルウェアをグローバルに適用するのではなく、特定のグループに適用します。

admin := r.Group("/admin")
admin.Use(AuthRequired(), AdminOnly())
admin.GET("/users", listUsers)

ミドルウェアの実行順序

ミドルウェアは、ハンドラーの前では登録順に実行され、c.Next()から戻った後は逆順に実行されます。各層が次の層を包む、玉ねぎのような構造だと考えるとわかりやすいでしょう。

クイックチェック

Ginのミドルウェアは、どのようにしてリクエストがハンドラーに到達するのを防ぐのでしょうか。

まとめ:Ginミドルウェア

重要なポイント:

  • HandlerFuncはgin.HandlerFuncを返し、継続するにはc.Next()を呼び出します
  • チェーンにデータを渡すにはc.Set/c.Getを使用します
  • c.AbortWithStatusJSONでチェーンを停止し、エラーを送信します
  • 全体にはr.Use、グループ単位にはgroup.Useで適用します
無料で開始

AI チューターと学ぶ Go — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「Ginミドルウェア:認証とロギング」レッスンは無料ですか?

はい。「Ginミドルウェア:認証とロギング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「Ginミドルウェア:認証とロギング」で何を学びますか?

Ginミドルウェアを作成して登録します。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Ginミドルウェア:認証とロギング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Ginルーターとルートグループ
  2. リクエストバインディングとバリデーション
  3. レスポンスヘルパーとステータスコード
  4. Ginミドルウェア:認証とロギング
← Go Academyに戻る