Golang gRPC如何实现认证_Golang gRPC鉴权方案-Golang

gRPC服务端必须启用TLS,否则JWT认证无效;需用ServerTLSFromFile加载证书,客户端用ClientTLSFromFile并校验域名;AuthInterceptor统一校验JWT,禁用HS256;PerRPCCredentials自动携带token;mTLS是服务间认证基线,需双向验证与证书轮换机制。

gRPC服务端必须启用TLS,否则JWT认证形同虚设

不启用TLS就传JWT,相当于把密码写在明信片上寄出去——authorization header 会被中间人直接截获复用。gRPC 的 metadata 在 HTTP/2 层透传,但本身不加密;没 TLS,所有认证信息都裸奔。

  • 服务端必须用 credentials.NewServerTLSFromFile("server.crt", "server.key") 加载证书,不能用 grpc.WithInsecure()
  • 客户端连接时,必须用 credentials.NewClientTLSFromFile("ca.crt", "your-service.example"),其中域名要和证书 CN 或 SAN 匹配,否则校验失败
  • 开发阶段若用自签名证书,客户端别跳过验证(即不要设 RequireTransportSecurity()=false),而应加载 CA 证书池:credentials.NewClientTLSFromCert(pool, "")

用 UnaryInterceptor 统一校验 JWT,但别在每个方法里重复写

把 token 解析、签名校验、过期检查、iss/aud 校验全塞进每个 RPC 方法里,既难维护又容易漏逻辑。正确做法是写一个 AuthInterceptor,用 grpc.UnaryInterceptor 注册到 server。

  • 拦截器里用 metadata.FromIncomingContext(ctx) 提取 authorization,注意 key 是小写,且值格式为 "Bearer xxx"
  • 校验必须用 RS256/ES256,禁止 HS256:私钥只存于授权中心,服务端只加载公钥(*rsa.PublicKey),避免密钥泄露风险
  • 失败时统一返回 status.Error(codes.Unauthenticated, "invalid token"),不要暴露是 exp 过期还是 aud 不匹配——防止信息泄露

PerRPCCredentials 比手动 AppendToOutgoingContext 更可靠

有人喜欢在每次调用前用 metadata.AppendToOutgoingContext(ctx, "authorization", "Bearer "+token),这看似简单,但极易遗漏或错放在错误的 context 上(比如用了 background context 而非带 timeout 的)。更健壮的方式是实现 credentials.PerRPCCredentials 接口。

  • 结构体只需实现两个方法:GetRequestMetadata() 返回 map[string]string,RequireTransportSecurity() 必须返回 true
  • 初始化 client 时直接传 grpc.WithPerRPCCredentials(&auth{token: tokenStr}),后续所有 RPC 自动携带,无需每处手动构造 context
  • 如果 token 需刷新(如短期 JWT),可在此结构体中加锁 + 延迟加载逻辑,比在业务层轮询续期更集中可控

mTLS 不是“锦上添花”,而是服务间通信的基线要求

只靠 JWT 不足以证明“你是谁”,只能证明“你持有某个 token”;而 mTLS 才能确认“你确实是 service-a.prod.svc.cluster.local”。尤其在 Kubernetes 内部服务调用场景下,mTLS 是零信任架构的起点。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Golang gRPC如何实现认证_Golang gRPC鉴权方案-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4034972+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4034972+
  • 本周更新: 0+
  • 最后更新: 2026-03-16