如何为GRPC连接实现Basic Auth TransportCredentials?
正确实现Go gRPC基础认证连接Camunda Zeebe网关
原思路的问题
你之前用TransportCredentials来实现基础认证是方向错误的:
TransportCredentials是gRPC用来处理传输层安全的接口(比如TLS加密、客户端证书认证),负责连接级别的安全握手,不是用来添加应用层的Authorization请求头的。- 基础认证属于应用层认证,需要在每个RPC请求中携带
Authorization头,应该用credentials.PerRPCCredentials接口来实现。
正确实现方案
1. 实现PerRPCCredentials接口
这个接口会让gRPC在每个RPC调用时自动注入认证头:
import ( "context" "encoding/base64" "google.golang.org/grpc/credentials" ) type BasicAuthCredentials struct { Username string Password string } // GetRequestMetadata 返回要添加到RPC请求的元数据(请求头) func (c *BasicAuthCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { authStr := c.Username + ":" + c.Password encodedAuth := base64.StdEncoding.EncodeToString([]byte(authStr)) return map[string]string{ "Authorization": "Basic " + encodedAuth, }, nil } // RequireTransportSecurity 指定是否需要传输层安全(TLS) // 生产环境建议返回true,测试环境如果未启用TLS可返回false func (c *BasicAuthCredentials) RequireTransportSecurity() bool { return true }
2. 创建Zeebe客户端
将自定义的认证凭证通过grpc.WithPerRPCCredentials传入DialOption,同时根据网关配置添加TLS凭证(如果启用TLS):
import ( zbc "github.com/camunda/zeebe/clients/go/v8/pkg/zbc" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) func main() { gatewayAddress := "your-zeebe-gateway-address:26500" username := "your-auth-username" password := "your-auth-password" // 配置TLS凭证(生产环境必须启用TLS) tlsCreds, err := credentials.NewClientTLSFromCert(nil, "") if err != nil { panic(err) } client, err := zbc.NewClient(&zbc.ClientConfig{ GatewayAddress: gatewayAddress, DialOpts: []grpc.DialOption{ // 传输层TLS加密(如果网关启用TLS) grpc.WithTransportCredentials(tlsCreds), // 应用层基础认证,自动注入Authorization头 grpc.WithPerRPCCredentials(&BasicAuthCredentials{ Username: username, Password: password, }), }, }) if err != nil { panic(err) } // 后续使用client执行Zeebe操作 }
关键说明
- 如果你的Zeebe网关未启用TLS(仅测试场景),可以去掉
grpc.WithTransportCredentials,并将RequireTransportSecurity返回false。 PerRPCCredentials会在每个RPC请求中自动添加Authorization头,无需手动处理连接的net.Conn对象。
内容的提问来源于stack exchange,提问作者NotX
相关产品推荐
相关产品推荐

