gRPC(七)进阶:自定义身份验证

Golang
371
0
0
2022-11-24
标签   gRPC

前言

个人网站: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 实现全局身份验证。