gRPC---自定义Token验证

这篇具有很好参考价值的文章主要介绍了gRPC---自定义Token验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)
}

到了这里,关于gRPC---自定义Token验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .netcore grpc身份验证和授权

    权限认证这里使用IdentityServer4配合JWT进行认证 通过AddAuthentication和AddAuthorization方法进行鉴权授权注入;通过UseAuthentication和UseAuthorization启用鉴权授权 增加授权策略处理 使用密码模式,及简易内存处理 生成token带入grpc的metadata进行传递 服务端对应的方法标记特性[Authorize]进行

    2024年02月12日
    浏览(41)
  • Flask 实现Token认证机制

    在Flask框架中,实现Token认证机制并不是一件复杂的事情。除了使用官方提供的 flask_httpauth 模块或者第三方模块 flask-jwt ,我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌(Token),并在用户每次请求时验证这个令牌的有效性。

    2024年02月05日
    浏览(49)
  • Java实现基于token认证

    Jwt全称是:json web token,以JSON对象的形式安全的传递信息。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。 用户登录返回token进行验证的流程: 用户使用账号发出post请求; 服务器使用私钥创建一

    2024年02月05日
    浏览(27)
  • Websocket实现token认证方式

    Websocket实现token认证方式 1.将token放到header中 java客户端代码展示 2.将token放在url上 java客户端代码展示 3.将token放到 WebSockets的Sec-WebSocket-Protocol中 java客户端代码展示 第一种方式很好理解,正常http协议也是这么做的;但是前端的websocket client js 不支持传递header,所以就出现了第

    2024年02月12日
    浏览(33)
  • API POST加上token认证

    在使用api post工具,或postman等工具调用后台接口时,有些情况,是因为没有加入token认证,而导致访问失败 这时候,可以加上如下的配置: 在认证选项卡中选择Bearer auth认证,并在token输入框中输入token值即可。

    2024年02月11日
    浏览(29)
  • Python Flask token身份认证

    首先安装依赖: 然后在主应用中(项目入口文件)加入以下代码:  user接口

    2024年02月11日
    浏览(38)
  • Django DRF - 【Token】认证基本使用

    Django Rest Framework Token 是Django Rest Framework中的一个扩展,用于实现用户认证和授权。它为每个用户生成一个唯一的Token,并将其存储在数据库中。在用户进行API请求时,用户需要在请求的HTTP Header中包含Token,这样服务器就可以验证用户的身份。 迁移完成会生成 authtoken_token 这张

    2024年02月12日
    浏览(37)
  • token验证

    什么是token?我相信很多开发者都或多或少听过基于 token 的用户鉴权和基于 session 的用户鉴权,而今天说的 token 验证就是第一种了。token 的意思是“令牌”,是用户第一次登录服务器返回的,它能让用户不需要提交账户和密码就能进行服务器验证身份,它是被放在请求头中一

    2023年04月14日
    浏览(23)
  • Token详解及安全验证

    最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是

    2024年02月13日
    浏览(21)
  • 对敏感操作的二次认证 —— 详解 Sa-Token 二级认证

    在某些敏感操作下,我们需要对已登录的会话进行二次验证。 比如代码托管平台的仓库删除操作,尽管我们已经登录了账号,当我们点击 [删除] 按钮时,还是需要再次输入一遍密码,这么做主要为了两点: 保证操作者是当前账号本人。 增加操作步骤,防止误删除重要数据。

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包