You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:45:11