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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Protocol Buffersと.protoファイル
- Unary gRPCサービスの実装
- サーバーストリーミングとクライアントストリーミング
- gRPCインターセプターとメタデータ