Token认证
我们先看一个gRPC提供我们的一个接口,这个接口中有两个方法,接口位于credentials包下,这个接口需要客户端来实现文章来源地址https://www.toymoban.com/news/detail-427969.html
type PerRPCCredentials interface {
GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error)
// RequireTransportSecurity indicates whether the credentials requires
// transport security.
RequireTransportSecurity() bool
}
第一个方法作用是获取元数组信息,也就是客户端提供的key,value对,context用于控制超时和取消,uri是请求入口处的uri,
第二个方法的作用是否需要基于TLS认证进行安全传输,如果返回值是true,则必须加上TLS验证,返回值是false则不用
gRPC将各种认证方式浓缩统一到一个凭证(credentials)上,可以单独使用一种凭证,比如只使用TLS凭证或者只使用自定义凭证,也可以多种凭证组合,gRPC提供统一的API验证机制,使研发人员使用方便。
服务端代码
package main
import (
"context"
"errors"
"fmt"
pb "gRPC_test/hello-server/proto"
"net"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
)
type server struct {
pb.UnimplementedSayHelloServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequests) (*pb.HelloResponse, error) {
// 获取原数据的信息
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
return nil, errors.New("未传输token")
}
var appId string
var appKey string
if v, ok := md["appid"]; ok {
appId = v[0]
}
if v, ok := md["appkey"]; ok {
appKey = v[0]
}
// 校验
if appId != "krien" || appKey != "123123" {
return nil, errors.New("token不正确")
}
return &pb.HelloResponse{ResponseMsg: "hello" + req.RequestName}, nil
}
func main() {
// TSL认证
// 证书签名文件和私钥文件
// creds, _ := credentials.NewServerTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.key")
// 开启端口
listen, _ := net.Listen("tcp", ":9090")
// 创建gRPC服务
grpcServer := grpc.NewServer(grpc.Creds(insecure.NewCredentials()))
// 在gRPC服务端中去注册我们编写的服务
pb.RegisterSayHelloServer(grpcServer, &server{})
// 启动服务
err := grpcServer.Serve(listen)
if err != nil {
fmt.Printf("failed to serve :%v ", err)
return
}
}
客户端代码
package main
import (
"context"
"fmt"
"log"
pb "gRPC/hello-server/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
type ClientTokenAuth struct {
}
func (c ClientTokenAuth) GetRequestsMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
return map[string]string{
"appId": "krien",
"appKey": "123123",
}, nil
}
func (c ClientTokenAuth) RequireTransportSecurity() bool {
return false
}
func main() {
var opts []grpc.DialOption
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
opts = append(opts, grpc.WithPerRPCCredentials(new(ClientTokenAuth)))
// creds, _ := credentials.NewClientTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "*.kangstudy.com")
conn, err := grpc.Dial("127.0.0.1:9090", opts...)
if err != nil {
log.Fatalf("did not connect:%v", err)
}
// 所有的连接用完都要关闭连接
defer conn.Close()
// 建立连接
client := pb.NewSayHelloClient(conn)
// 执行rpc调用(这个方法在服务器端来实现并返回结果)
resp, _ := client.SayHello(context.Background(), &pb.HelloRequests{RequestName: "krien"})
fmt.Println(resp.ResponseMsg)
}
文章来源:https://www.toymoban.com/news/detail-427969.html
到了这里,关于gRPC---自定义Token验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!