0Pricing
Go Academy · レッスン

gRPCインターセプターとメタデータ

認証、ロギングミドルウェア、gRPCメタデータ

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

インターセプターとは

gRPCインターセプター(ミドルウェア)は、RPCハンドラーの前後に実行されます。ロギング、認証トークンの検証、メトリクス、パニックからの復旧、トレーシングなど、横断的な関心事を追加できます。

unaryサーバーインターセプター

unaryサーバーインターセプターは、追加のロジックでハンドラーをラップします:

func LoggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    log.Printf("RPC: %s", info.FullMethod)
    resp, err := handler(ctx, req)
    log.Printf("done: %v", err)
    return resp, err
}

grpcSrv := grpc.NewServer(grpc.UnaryInterceptor(LoggingInterceptor))

ストリームサーバーインターセプター

unaryの場合と同様ですが、ストリームハンドラーをラップします:

func StreamLogging(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
    log.Printf("stream: %s", info.FullMethod)
    return handler(srv, ss)
}

インターセプターのチェーン

grpc.ChainUnaryInterceptor(Go gRPC v1.38以降)を使用すると、複数のインターセプターを順番に適用できます:

grpcSrv := grpc.NewServer(
    grpc.ChainUnaryInterceptor(LoggingInterceptor, AuthInterceptor, MetricsInterceptor),
)

クライアントインターセプター

クライアント側のunaryインターセプターは送信する呼び出しをラップします。認証トークン、リトライ、トレーシングヘッダーの注入などに便利です:

conn, _ := grpc.NewClient(addr,
    grpc.WithUnaryInterceptor(ClientAuthInterceptor),
    grpc.WithTransportCredentials(insecure.NewCredentials()),
)

gRPCメタデータ

メタデータはRPCと一緒に送信されるキーと値の組で、HTTPヘッダーに相当します。クライアントではmetadata.Newとmetadata.NewOutgoingContextを使用します。

md := metadata.New(map[string]string{"authorization": "Bearer " + token})
ctx := metadata.NewOutgoingContext(context.Background(), md)

サーバーでのメタデータの読み取り

metadata.FromIncomingContextで受信メタデータを取り出します:

md, ok := metadata.FromIncomingContext(ctx)
if !ok { return nil, status.Error(codes.Unauthenticated, "no metadata") }
token := md["authorization"]

サーバーからのメタデータ送信

grpc.SetHeaderとgrpc.SetTrailerを使用して、サーバーからレスポンスヘッダーとトレーラーを送信します:

grpc.SetHeader(ctx, metadata.Pairs("x-request-id", requestID))

go-grpc-middleware

github.com/grpc-ecosystem/go-grpc-middleware/v2ライブラリには、リカバリー、ロギング(zap/logrus)、認証など、すぐに使えるインターセプターが用意されています。

認証インターセプターのパターン

インターセプターでトークンを取り出して検証し、下流のハンドラーで使えるようにユーザーをコンテキストに追加します:

func AuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    md, _ := metadata.FromIncomingContext(ctx)
    if !validateToken(md["authorization"]) {
        return nil, status.Error(codes.Unauthenticated, "invalid token")
    }
    return handler(ctx, req)
}

パニックリカバリーインターセプター

ハンドラーをラップしてパニックから復旧し、クラッシュさせる代わりにInternalエラーを返します:

defer func() {
    if r := recover(); r != nil {
        err = status.Errorf(codes.Internal, "panic: %v", r)
    }
}()

クイックチェック

gRPCクライアントとサーバーの間で認証トークンを渡すには、どうすればよいですか?

復習:gRPCインターセプターとメタデータ

重要なポイント:

  • unaryインターセプター:func(ctx, req, info, handler) (resp, error)
  • 複数のインターセプターにはgrpc.ChainUnaryInterceptorを使用します
  • メタデータはキーと値の組で、HTTPヘッダーに相当します
  • 認証インターセプター:メタデータを取り出す → 検証する → ユーザーをコンテキストに追加する

よくある質問

「gRPCインターセプターとメタデータ」レッスンは無料ですか?

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

「gRPCインターセプターとメタデータ」で何を学びますか?

認証、ロギングミドルウェア、gRPCメタデータ ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「gRPCインターセプターとメタデータ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. Protocol Buffersと.protoファイル
  2. Unary gRPCサービスの実装
  3. サーバーストリーミングとクライアントストリーミング
  4. gRPCインターセプターとメタデータ
← Go Academyに戻る