首页 > 其他分享 >Golang使用grpc实现token拦截

Golang使用grpc实现token拦截

时间:2023-11-06 16:34:19浏览次数:36  
标签:pb golang string err grpc Golang token org

上一篇简单使用了grpcGolang简单使用grpc

server

package main

import (
	"fmt"
	"golang.org/x/net/context"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/grpclog"
	"google.golang.org/grpc/metadata"
	"google.golang.org/grpc/status"
	"net"
	"rpc-demo/pb/pb" // 引入编译生成的包
)

const (
	// Address gRPC服务地址
	Address = "127.0.0.1:50052"
)

// 定义HelloService并实现约定的接口
type HelloService struct {
	pb.HelloServer
}

// SayHello 实现Hello服务接口
func (h *HelloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
	resp := new(pb.HelloResponse)
	resp.Message = fmt.Sprintf("Hello %s.", in.Name)

	return resp, nil
}

func Auth(ctx context.Context) error {
	md, ok := metadata.FromIncomingContext(ctx)
	if !ok {
		return fmt.Errorf("missing credentials")
	}
	var user string
	var password string

	if val, ok := md["user"]; ok {
		user = val[0]
	}
	if val, ok := md["password"]; ok {
		password = val[0]
	}

	if user != "admin" || password != "admin" {
		return status.Errorf(codes.Unauthenticated, "客户端请求的token不合法")
	}
	return nil
}

func main() {
	listen, err := net.Listen("tcp", Address)
	if err != nil {
		grpclog.Fatalf("Failed to listen: %v", err)
	}
	var authInterceptor grpc.UnaryServerInterceptor

	//匿名方法
	authInterceptor = func(
		ctx context.Context,
		req interface{},
		info *grpc.UnaryServerInfo,
		handler grpc.UnaryHandler,
	) (resp interface{}, err error) {
		//拦截普通方法请求,验证 Token
		err = Auth(ctx)
		if err != nil {
			return
		}
		// 继续处理请求
		return handler(ctx, req)
	}
	s := grpc.NewServer(grpc.UnaryInterceptor(authInterceptor))
	// 注册HelloService
	pb.RegisterHelloServer(s, &HelloService{})
	fmt.Println("Listen on " + Address)
	err = s.Serve(listen)
	if err != nil {
		fmt.Println(err)
	}
}

client

package main

import (
	"fmt"
	"golang.org/x/net/context"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"google.golang.org/grpc/grpclog"
	pb "rpc-demo/pb/pb" // 引入proto包
)

const (
	// Address gRPC服务地址
	Address = "127.0.0.1:50052"
)

type PerRPCCredentials interface {

	//GetRequestMetadata 方法返回认证需要的必要信息
	GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error)

	//RequireTransportSecurity 方法表示是否启用安全链接,在生产环境中,一般都是启用的,但为了测试方便,暂时这里不启用
	RequireTransportSecurity() bool
}
type Authentication struct {
	User     string
	Password string
}

func (a *Authentication) GetRequestMetadata(context.Context, ...string) (map[string]string, error) {
	return map[string]string{"user": a.User, "password": a.Password}, nil
}

func (a *Authentication) RequireTransportSecurity() bool {
	return false
}

func main() {
	// 连接
	user := &Authentication{
		User:     "admin",
		Password: "admin",
	}
	//1、 建立连接
	conn, err := grpc.Dial(Address, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithPerRPCCredentials(user))
	//conn, err := grpc.Dial(Address, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		grpclog.Fatalln(err)
	}
	defer conn.Close()

	// 初始化客户端
	c := pb.NewHelloClient(conn)

	// 调用方法
	req := &pb.HelloRequest{Name: "gRPC"}
	res, err := c.SayHello(context.Background(), req)

	if err != nil {
		grpclog.Fatalln(err)
	}

	fmt.Println(res.Message)
}

如果客户端的账户密码不是admin,admin服务器就会拦截

标签:pb,golang,string,err,grpc,Golang,token,org
From: https://www.cnblogs.com/qcy-blog/p/17813041.html

相关文章

  • Golang实现grpc单向认证
    接着上篇文章写Golang简单使用grpcgolang1.15+版本上,用gRPC通过TLS实现数据传输加密时,会报错证书的问题:rpcerror:code=Unavailabledesc=connectionerror:desc="transport:authenticationhandshakefailed:x509:certificateisnotvalidforanynames,but......
  • Golang面试题从浅入深高频必刷「2023版」
    大家好,我是阳哥。专注Go语言的学习经验分享和就业辅导。Go语言特点Go语言相比C++/Java等语言是优雅且简洁的,是我最喜爱的编程语言之一,它既保留了C++的高性能,又可以像Java,Python优雅的调用三方库和管理项目,同时还有接口,自动垃圾回收和goroutine等让人拍案叫绝的设计。有许多基于......
  • 基于 Axios 封装一个完美的双 token 无感刷新
    用户登录之后,会返回一个用户的标识,之后带上这个标识请求别的接口,就能识别出该用户。标识登录状态的方案有两种:session和jwt。session是通过cookie返回一个id,关联服务端内存里保存的session对象,请求时服务端取出cookie里id对应的session对象,就可以拿到用户信息。jwt......
  • 复习 Golang Chapter 2 原始类型和声明
    内建类型的使用变量与常量的使用以及惯例写一些代码,看一看如何"最好"的运用他们,关于什么是“最好”,这里有一个最主要的原则:让你的意图能够透过代码清晰的表示出来内建类型Built-inTypes惯用法是跨语言使用者的障碍,学一门新的编程语言,主要是向这个方向靠拢(可通过开源代码和......
  • Cookie、session、token、sign鉴权
    Cookie及token请求原理:cookie信息 第一次访问及登陆接口的响应头里会返回:set-cookie,包含Uid,sessionId、域名domain;token是在登陆接口的响应体里返回的。其它接口在请求头里携带cookie或token.web通常用cookie,移动端通常用token Cookie是在响应头里返......
  • GRPC
    先决条件GoProtocolbuffercompiler,protoc,version3https://github.com/protocolbuffers/protobuf/releases/tag/v25.0Gopluginsforprotocolcompiler`goinstallgoogle.golang.org/protobuf/cmd/[email protected]``goinstallgoogle.golang.org/grpc/cmd/protoc-ge......
  • 复习 Golang Chapter 1 开发环境与配置
    学习安装以及配置常见的Go环境变量用于开发环境学习Go的一些基本命令以及工具(Makefile)如何安装与组织你的目录go编译器的安装方法直接上官方网站按自己的操作系统来youarefreetoorganizeyourprojectsasyouseefit.环境变量你安装的third-party工具所在......
  • Golang使用mqtt
    示例使用使用EMQX提供的免费公共MQTT服务器,该服务基于EMQX的MQTT物联网云平台创建。服务器接入信息如下:Broker:broker.emqx.ioTCPPort:1883WebsocketPort:8083golang代码如下packagemainimport( "fmt" mqtt"github.com/eclipse/paho.mqtt.golang" "time......
  • Delegation Token认证流程
    1.背景https://blog.51cto.com/u_15327484/8153877文章中介绍了Hadoop中使用kerberos机制进行认证。在客户端初次访问服务端时,通过JAAS获取TGT,再通过GSSAPIonSASL获取serviceticket完成认证。在用户向Yarn提交作业时,如果作业有上万个container,每个container都会访问HDFS的Nam......
  • Go语言Golang DevOps运维开发实战集训营,高级运维必修
    Go语言GolangDevOps运维开发实战集训营,高级运维必修Go语言简介Go语言,也称为Golang,是一门由Google开发的开源编程语言。它的设计目标是提供一种高效、简洁、安全且支持并发的编程语言,适用于构建可靠且高性能的软件系统。Go语言在短短的时间内迅速走红,成为开发者们喜爱的选择,因......