前言
个人网站:linzyblog.netlify.app/
示例代码已经上传到github:点击跳转
gRPC官方文档:点击跳转
在前面的章节中,我们介绍了两种可全局认证的方法:
- 基于 CA 的 TLS 证书认证
- 拦截器 interceptor
而在实际需求中,常常会对某些模块的 RPC 方法做特殊认证或校验,而gRPC也专门提供了这类特殊认证的接口。
《通过TLS建立安全连接》server.go添加以下内容:
if tokenAuth.IsTLS {
// TLS认证 // 根据服务端输入的证书文件和密钥构造 TLS 凭证
c, err := credentials.NewServerTLSFromFile("./conf/server_side_TLS/server.pem", "./conf/server_side_TLS/server.key")
if err != nil {
log.Fatalf("credentials.NewServerTLSFromFile err: %v", err)
}
opts = append(opts, grpc.Creds(c))
}
client.go添加以下内容:
if tokenAuth.IsTLS {
//打开tls 走tls认证 // 根据客户端输入的证书文件和密钥构造 TLS 凭证。 // 第二个参数 serverNameOverride 为服务名称。
c, err := credentials.NewClientTLSFromFile("./conf/server_side_TLS/server.pem", "go-grpc-example")
if err != nil {
log.Fatalf("credentials.NewClientTLSFromFile err: %v", err)
}
opts = append(opts, grpc.WithTransportCredentials(c))
} else {
opts = append(opts, grpc.WithInsecure())
}
我们只需要修改token.go文件内的IsTLS
变量就可以实现是否使用安全链接(TLS)。
启动 & 请求之后我们抓个包看一下是否已经建立安全链接了了。
三、小结
1)实现credentials.PerRPCCredentials
接口就可以把数据当做 gRPC 中的 Credential 在添加到 metadata 中,跟着请求一起传递到服务端;
2)服务端从 ctx 中解析 metadata,然后从 metadata 中获取 授权信息并进行验证;
3)可以借助 Interceptor 实现全局身份验证。