🦤

【Go】gRPC-connectでInterceptorの処理を特定メソッドだけスキップしたい

2023/09/27に公開

概要

gRPC-connectでは、メソッドの処理を行う前後に処理を挟むことができるInterceptorsの機能が用意されています。ただ、gRPCと同様に特定のメソッドだけInterceptorを通さないという機能は現状(2023年9月時点)では無いようです。そのような場合、どう対応するかというのを今回メモ書きします。

前提

  • 使用したconnect-goのバージョンはv1.10.0です。

対応方針

実装サンプル

Interceptor部分の実装を以下に記載します。

package interceptor

import (
	"context"

	"github.com/bufbuild/connect-go"
	"golang.org/x/exp/slices"
)

// Interceptorが不要なメソッドの名前
var authNotRequiredInterceptorMethods = []string{
	"/sample.UserAccountService/RegisterUserAccount",
	"/sample.UserAccountService/LoginByGoogle",
}

func AuthInterceptor() connect.UnaryInterceptorFunc {
	return func(next connect.UnaryFunc) connect.UnaryFunc {
		return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) {
			if req.Spec().IsClient {
				// do nothing
				return next(ctx, req)
			}
			// Interceptor不要なメソッド判定
			if slices.Contains(authNotRequiredInterceptorMethods, req.Spec().Procedure) {
				// do nothing
				return next(ctx, req)
			}

			// Interceptorの処理
			・
			・
			・

			return next(ctx, req)
		}
	}
}

Discussion