Skip to content

Commit 088c2e7

Browse files
committed
feat: Add support for grpc jwt middleware.
see #181
1 parent 4f02637 commit 088c2e7

File tree

30 files changed

+886
-87
lines changed

30 files changed

+886
-87
lines changed

error_handler.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package jwtmiddleware
22

33
import (
4+
"context"
45
"errors"
56
"fmt"
7+
"google.golang.org/grpc"
8+
"google.golang.org/grpc/codes"
9+
"google.golang.org/grpc/status"
610
"net/http"
711
)
812

@@ -28,7 +32,7 @@ type ErrorHandler func(w http.ResponseWriter, r *http.Request, err error)
2832
// DefaultErrorHandler is the default error handler implementation for the
2933
// JWTMiddleware. If an error handler is not provided via the WithErrorHandler
3034
// option this will be used.
31-
func DefaultErrorHandler(w http.ResponseWriter, r *http.Request, err error) {
35+
func DefaultErrorHandler(w http.ResponseWriter, _ *http.Request, err error) {
3236
w.Header().Set("Content-Type", "application/json")
3337

3438
switch {
@@ -67,3 +71,48 @@ func (e invalidError) Error() string {
6771
func (e invalidError) Unwrap() error {
6872
return e.details
6973
}
74+
75+
type GrpcErrorHandler struct {
76+
GrpcUnaryErrorHandler
77+
GrpcStreamErrorHandler
78+
}
79+
80+
type GrpcUnaryErrorHandler func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler, err error) (any, error)
81+
type GrpcStreamErrorHandler func(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler, err error) error
82+
83+
func DefaultGrpcErrorHandler() GrpcErrorHandler {
84+
return GrpcErrorHandler{
85+
GrpcUnaryErrorHandler: DefaultGrpcUnaryErrorHandler,
86+
GrpcStreamErrorHandler: DefaultGrpcStreamErrorHandler,
87+
}
88+
}
89+
90+
func DefaultGrpcUnaryErrorHandler(ctx context.Context, req any, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler, err error) (any, error) {
91+
if err != nil {
92+
switch {
93+
case errors.Is(err, ErrJWTMissing):
94+
return nil, status.Errorf(codes.InvalidArgument, ErrJWTMissing.Error())
95+
case errors.Is(err, ErrJWTInvalid):
96+
return nil, status.Errorf(codes.Unauthenticated, ErrJWTInvalid.Error())
97+
default:
98+
return nil, status.Errorf(codes.Internal, err.Error())
99+
}
100+
}
101+
102+
return handler(ctx, req)
103+
}
104+
105+
func DefaultGrpcStreamErrorHandler(srv any, ss grpc.ServerStream, _ *grpc.StreamServerInfo, handler grpc.StreamHandler, err error) error {
106+
if err != nil {
107+
switch {
108+
case errors.Is(err, ErrJWTMissing):
109+
return status.Errorf(codes.InvalidArgument, ErrJWTMissing.Error())
110+
case errors.Is(err, ErrJWTInvalid):
111+
return status.Errorf(codes.Unauthenticated, ErrJWTInvalid.Error())
112+
default:
113+
return status.Errorf(codes.Internal, err.Error())
114+
}
115+
}
116+
117+
return handler(srv, newWrappedStream(ss))
118+
}

examples/echo-example/go.mod

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ require (
1515
github.com/mattn/go-isatty v0.0.19 // indirect
1616
github.com/valyala/bytebufferpool v1.0.0 // indirect
1717
github.com/valyala/fasttemplate v1.2.2 // indirect
18-
golang.org/x/crypto v0.21.0 // indirect
19-
golang.org/x/net v0.23.0 // indirect
20-
golang.org/x/sys v0.18.0 // indirect
21-
golang.org/x/text v0.14.0 // indirect
22-
gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect
18+
golang.org/x/crypto v0.27.0 // indirect
19+
golang.org/x/net v0.29.0 // indirect
20+
golang.org/x/sys v0.25.0 // indirect
21+
golang.org/x/text v0.18.0 // indirect
2322
)

examples/echo-example/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,21 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ
2525
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
2626
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
2727
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
28+
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
2829
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
2930
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
31+
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
3032
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3133
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3234
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3335
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3436
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3537
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
3638
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
39+
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
3740
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
3841
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
42+
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
3943
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
4044
gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs=
4145
gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=

examples/gin-example/go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ require (
2929
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
3030
github.com/ugorji/go/codec v1.2.11 // indirect
3131
golang.org/x/arch v0.5.0 // indirect
32-
golang.org/x/crypto v0.21.0 // indirect
33-
golang.org/x/net v0.23.0 // indirect
34-
golang.org/x/sys v0.18.0 // indirect
35-
golang.org/x/text v0.14.0 // indirect
36-
google.golang.org/protobuf v1.33.0 // indirect
32+
golang.org/x/crypto v0.27.0 // indirect
33+
golang.org/x/net v0.29.0 // indirect
34+
golang.org/x/sys v0.25.0 // indirect
35+
golang.org/x/text v0.18.0 // indirect
36+
google.golang.org/protobuf v1.34.2 // indirect
3737
gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect
3838
gopkg.in/yaml.v3 v3.0.1 // indirect
3939
)

examples/gin-example/go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,21 @@ golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y=
6767
golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
6868
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
6969
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
70+
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
7071
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
7172
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
73+
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
7274
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
7375
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
7476
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
7577
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
78+
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
7679
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
7780
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
81+
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
7882
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
7983
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
84+
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
8085
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
8186
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
8287
gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs=

examples/grpc-example/example.pb.go

Lines changed: 149 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
syntax = "proto3";
2+
3+
package example;
4+
option go_package = "example.com/main";
5+
6+
service ExampleService {
7+
rpc DoSomething(ExampleMesage) returns (ExampleMesage) {}
8+
}
9+
10+
message ExampleMesage {
11+
string msg = 1;
12+
}

0 commit comments

Comments
 (0)