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 13
tokenStr, 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 12
conn, 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
存入上下文中
|
|