gRPC JWT Auth
目录
GRPC 实现自定义认证,这里用 jwt token 作为示例。
定义认证方式,实现 credentials.PerRPCCredentials 接口
| |
客户端
多次鉴权:创建连接时添加额外的 option
grpc.WithPerRPCCredentials(auth),可以编写一个 TokenManager 用于缓存/刷新 token1 2 3 4 5 6 7 8 9 10 11 12 13tokenStr, err := jwt.Generate("saltfish") if err != nil { log.Fatalf("generate token failed: %s", err) } auth := jwt.Auth{Token: tokenStr} conn, err := grpc.Dial(":9000", grpc.WithInsecure(), grpc.WithPerRPCCredentials(auth)) if err != nil { log.Fatalf("did not connect: %s", err) } c := userv1.NewUserServiceClient(conn) r, err := c.CreateUser(context.Background(), &userv1.CreateUserRequest{})单次鉴权:请求时添加额外的 option
grpc.PerRPCCredentials(auth)1 2 3 4 5 6 7 8 9 10 11 12conn, err := grpc.Dial(":9000", grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %s", err) } c := userv1.NewUserServiceClient(conn) tokenStr, err := jwt.Generate("saltfish") if err != nil { log.Fatalf("generate token failed: %s", err) } auth := jwt.Auth{Token: tokenStr} r, err := c.CreateUser(context.Background(), &userv1.CreateUserRequest{}, grpc.PerRPCCredentials(auth))
服务端
使用 go-grpc-middleware 的 auth 中间件 grpc_auth.UnaryServerInterceptor,并自定义校验函数
| |
校验函数先从 context 中获取 token,再调用 Verify 方法验证 token 有效性
NewContext(ctx, claims)将claims存入上下文中
| |