Skip to content

Commit 3efa4d7

Browse files
committed
update: README file
1 parent 471d754 commit 3efa4d7

File tree

1 file changed

+116
-1
lines changed

1 file changed

+116
-1
lines changed

README.md

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,117 @@
11
# GRPC captcha validator
2-
GRPC captcha validation middleware
2+
The GRPC Captcha Validation Middleware is a Go module that provides a reusable middleware component for validating captcha challenges on GRPC servers. The middleware intercepts incoming requests, verifies the captcha challenge for the request using a configurable provider, and rejects the request if the challenge is not valid.
3+
4+
The module is designed to be configurable, with options to specify the captcha provider, challenge validation endpoint, and custom headers for the validation request. It uses the Google Protobuf library to parse the GRPC method descriptor and extract custom options defined using protobuf extensions.
5+
6+
## Feature
7+
- support Google, Cloudflare, hcaptcha provider to verify challenge
8+
- support unary and stream server middleware
9+
- captcha validation for specific rpc methods
10+
11+
# Example
12+
13+
example captcha for GRPC server:
14+
15+
```protobuf
16+
syntax = "proto3";
17+
package example;
18+
option go_package = "github.com/GoFarsi/grpc-captcha-validation/_example/proto";
19+
20+
import "captcha.proto";
21+
22+
service GreetingService {
23+
rpc Greeting(GreetingRequest) returns(GreetingResponse) {
24+
option(captcha.captcha) = {
25+
check_challenge: true,
26+
provider: GOOGLE,
27+
};
28+
}
29+
30+
rpc GreetingStream(stream GreetingRequest) returns(stream GreetingResponse) {
31+
option(captcha.captcha) = {
32+
check_challenge: true,
33+
provider: GOOGLE,
34+
};
35+
}
36+
}
37+
38+
message GreetingRequest {
39+
string name = 1;
40+
}
41+
42+
message GreetingResponse {
43+
string message = 1;
44+
}
45+
```
46+
47+
```go
48+
package main
49+
50+
import (
51+
"context"
52+
"fmt"
53+
gcv "github.com/GoFarsi/grpc-captcha-validation"
54+
"github.com/GoFarsi/grpc-captcha-validation/_example/proto"
55+
"google.golang.org/grpc"
56+
"google.golang.org/grpc/reflection"
57+
"io"
58+
"log"
59+
"net"
60+
)
61+
62+
type GreetingService struct {
63+
proto.UnimplementedGreetingServiceServer
64+
}
65+
66+
func (g *GreetingService) Greeting(ctx context.Context, in *proto.GreetingRequest) (*proto.GreetingResponse, error) {
67+
return &proto.GreetingResponse{
68+
Message: fmt.Sprintf("greeting %s", in.Name),
69+
}, nil
70+
}
71+
72+
func (g *GreetingService) GreetingStream(srv proto.GreetingService_GreetingStreamServer) error {
73+
ctx := srv.Context()
74+
for {
75+
select {
76+
case <-ctx.Done():
77+
return ctx.Err()
78+
default:
79+
}
80+
81+
req, err := srv.Recv()
82+
if err == io.EOF {
83+
log.Println("exit")
84+
return nil
85+
}
86+
if err != nil {
87+
log.Printf("receive error %v", err)
88+
continue
89+
}
90+
91+
resp := proto.GreetingResponse{Message: fmt.Sprintf("Greeting %s", req.Name)}
92+
if err := srv.Send(&resp); err != nil {
93+
log.Printf("send error %v", err)
94+
}
95+
}
96+
}
97+
98+
func main() {
99+
listener, err := net.Listen("tcp", ":8080")
100+
if err != nil {
101+
log.Fatalln(err)
102+
}
103+
104+
c := gcv.NewCaptcha("foo", "", "", "")
105+
106+
srv := grpc.NewServer(
107+
grpc.ChainUnaryInterceptor(c.UnaryServerInterceptor()),
108+
grpc.ChainStreamInterceptor(c.StreamServerInterceptor()),
109+
)
110+
111+
reflection.Register(srv)
112+
113+
proto.RegisterGreetingServiceServer(srv, &GreetingService{})
114+
115+
log.Fatalln(srv.Serve(listener))
116+
}
117+
```

0 commit comments

Comments
 (0)