4.8 对 RPC 方法做自定义认证
项目地址:https://github.com/EDDYCJY/go-grpc-example
前言
在前面的章节中,我们介绍了两种(证书算一种)可全局认证的方法:
而在实际需求中,常常会对某些模块的 RPC 方法做特殊认证或校验。今天将会讲解、实现这块的功能点
课前知识
type PerRPCCredentials interface {
GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error)
RequireTransportSecurity() bool
}在 gRPC 中默认定义了 PerRPCCredentials,它就是本章节的主角,是 gRPC 默认提供用于自定义认证的接口,它的作用是将所需的安全认证信息添加到每个 RPC 方法的上下文中。其包含 2 个方法:
GetRequestMetadata:获取当前请求认证所需的元数据(metadata)
RequireTransportSecurity:是否需要基于 TLS 认证进行安全传输
目录结构
新建 simple_token_server/server.go 和 simple_token_client/client.go,目录结构如下:
gRPC
Client
在 Client 端,重点实现 type PerRPCCredentials interface 所需的方法,关注两点即可:
struct Auth:GetRequestMetadata、RequireTransportSecurity
grpc.WithPerRPCCredentials
Server
在 Server 端就更简单了,实际就是调用 metadata.FromIncomingContext 从上下文中获取 metadata,再在不同的 RPC 方法中进行认证检查
验证
重新启动 server.go 和 client.go,得到以下结果:
修改 client.go 的值,制造两者不一致,得到无效结果:
一个个加太麻烦
我相信你肯定会问一个个加,也太麻烦了吧?有这个想法的你,应当把 type PerRPCCredentials interface 做成一个拦截器(interceptor)
总结
本章节比较简单,主要是针对 RPC 方法的自定义认证进行了介绍,如果是想做全局的,建议是举一反三从拦截器下手哦。
参考
本系列示例代码
Last updated
Was this helpful?