gRPC 默认提供了两种认证方式:
基于SSL/TLS认证方式
远程调用认证方式
两种方式可以混合使用
TLS认证示例
这里直接扩展hello项目,实现TLS认证机制
首先需要准备证书,在hello目录新建keys目录用于存放证书文件。
证书制作
制作私钥 (.key)
|
|
自签名公钥(x509) (PEM-encodings .pem
|.crt
)
|
|
自定义信息
|
|
目录结构
|
|
示例代码
proto/helloworld.proto
及proto/hello.pb.go
文件不需要改动
修改服务端代码:server/main.go
|
|
运行:
|
|
服务端在实例化grpc Server时,可配置多种选项,TLS认证是其中之一
客户端添加TLS认证:client/main.go
|
|
运行:
|
|
客户端添加TLS认证的方式和服务端类似,在创建连接Dial
时,同样可以配置多种选项,后面的示例中会看到更多的选项。
Token认证示例
再进一步,继续扩展hello-tls项目,实现TLS + Token认证机制
目录结构
|
|
示例代码
客户端实现:client/main.go
|
|
这里我们定义了一个customCredential
结构,并实现了两个方法GetRequestMetadata
和RequireTransportSecurity
。这是gRPC提供的自定义认证方式,每次RPC调用都会传输认证信息。customCredential
其实是实现了grpc/credential
包内的PerRPCCredentials
接口。每次调用,token信息会通过请求的metadata传输到服务端。下面具体看一下服务端如何获取metadata中的信息。
修改server/main.go中的SayHello方法:
|
|
运行:
|
|
运行客户端程序 client/main.go:
|
|