Ginミドルウェア:認証とロギング
Ginミドルウェアを作成して登録します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Ginルーターとルートグループ
- リクエストバインディングとバリデーション
- レスポンスヘルパーとステータスコード
- Ginミドルウェア:認証とロギング