🦤
【Go】gRPC-connectでInterceptorの処理を特定メソッドだけスキップしたい
概要
gRPC-connectでは、メソッドの処理を行う前後に処理を挟むことができるInterceptorsの機能が用意されています。ただ、gRPCと同様に特定のメソッドだけInterceptorを通さないという機能は現状(2023年9月時点)では無いようです。そのような場合、どう対応するかというのを今回メモ書きします。
前提
- 使用したconnect-goのバージョンは
v1.10.0
です。
対応方針
- [gRPC] メソッドレベルで異なる権限を実装してみるの記事にある通り、実行されるメソッド名を取得してInterceptorの処理スキップを判定するようにします。
- メソッド名の取得はBetter gRPC な Connect に乗り換える - Go言語編の記事の、ログのInterceptor部分を参考にして、
req.Spec().Procedure
で実装します。
実装サンプル
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