摘要:帶入對方法做自定義認證原文地址帶入對方法做自定義認證項目地址前言在前面的章節(jié)中,我們介紹了兩種證書算一種可全局認證的方法證書認證基于的證書認證而在實際需求中,常常會對某些模塊的方法做特殊認證或校驗。
帶入gRPC:對 RPC 方法做自定義認證
原文地址:帶入gRPC:對 RPC 方法做自定義認證
項目地址:https://github.com/EDDYCJY/go...
在前面的章節(jié)中,我們介紹了兩種(證書算一種)可全局認證的方法:
TLS 證書認證
基于 CA 的 TLS 證書認證
Unary and Stream interceptor
而在實際需求中,常常會對某些模塊的 RPC 方法做特殊認證或校驗。今天將會講解、實現(xiàn)這塊的功能點
課前知識type PerRPCCredentials interface { GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) RequireTransportSecurity() bool }
在 gRPC 中默認定義了 PerRPCCredentials,它就是本章節(jié)的主角,是 gRPC 默認提供用于自定義認證的接口,它的作用是將所需的安全認證信息添加到每個 RPC 方法的上下文中。其包含 2 個方法:
GetRequestMetadata:獲取當前請求認證所需的元數(shù)據(jù)(metadata)
RequireTransportSecurity:是否需要基于 TLS 認證進行安全傳輸
目錄結構新建 simple_token_server/server.go 和 simple_token_client/client.go,目錄結構如下:
go-grpc-example ├── client │?? ├── simple_client │?? ├── simple_http_client │?? ├── simple_token_client │?? └── stream_client ├── conf ├── pkg ├── proto ├── server │?? ├── simple_http_server │?? ├── simple_server │?? ├── simple_token_server │?? └── stream_server └── vendorgRPC Client
package main import ( "context" "log" "google.golang.org/grpc" "github.com/EDDYCJY/go-grpc-example/pkg/gtls" pb "github.com/EDDYCJY/go-grpc-example/proto" ) const PORT = "9004" type Auth struct { AppKey string AppSecret string } func (a *Auth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { return map[string]string{"app_key": a.AppKey, "app_secret": a.AppSecret}, nil } func (a *Auth) RequireTransportSecurity() bool { return true } func main() { tlsClient := gtls.Client{ ServerName: "go-grpc-example", CertFile: "../../conf/server/server.pem", } c, err := tlsClient.GetTLSCredentials() if err != nil { log.Fatalf("tlsClient.GetTLSCredentials err: %v", err) } auth := Auth{ AppKey: "eddycjy", AppSecret: "20181005", } conn, err := grpc.Dial(":"+PORT, grpc.WithTransportCredentials(c), grpc.WithPerRPCCredentials(&auth)) ... }
在 Client 端,重點實現(xiàn) type PerRPCCredentials interface 所需的方法,關注兩點即可:
struct Auth:GetRequestMetadata、RequireTransportSecurity
grpc.WithPerRPCCredentials
Serverpackage main import ( "context" "log" "net" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "github.com/EDDYCJY/go-grpc-example/pkg/gtls" pb "github.com/EDDYCJY/go-grpc-example/proto" ) type SearchService struct { auth *Auth } func (s *SearchService) Search(ctx context.Context, r *pb.SearchRequest) (*pb.SearchResponse, error) { if err := s.auth.Check(ctx); err != nil { return nil, err } return &pb.SearchResponse{Response: r.GetRequest() + " Token Server"}, nil } const PORT = "9004" func main() { ... } type Auth struct { appKey string appSecret string } func (a *Auth) Check(ctx context.Context) error { md, ok := metadata.FromIncomingContext(ctx) if !ok { return status.Errorf(codes.Unauthenticated, "自定義認證 Token 失敗") } var ( appKey string appSecret string ) if value, ok := md["app_key"]; ok { appKey = value[0] } if value, ok := md["app_secret"]; ok { appSecret = value[0] } if appKey != a.GetAppKey() || appSecret != a.GetAppSecret() { return status.Errorf(codes.Unauthenticated, "自定義認證 Token 無效") } return nil } func (a *Auth) GetAppKey() string { return "eddycjy" } func (a *Auth) GetAppSecret() string { return "20181005" }
在 Server 端就更簡單了,實際就是調(diào)用 metadata.FromIncomingContext 從上下文中獲取 metadata,再在不同的 RPC 方法中進行認證檢查
驗證重新啟動 server.go 和 client.go,得到以下結果:
$ go run client.go 2018/10/05 20:59:58 resp: gRPC Token Server
修改 client.go 的值,制造兩者不一致,得到無效結果:
$ go run client.go 2018/10/05 21:00:05 client.Search err: rpc error: code = Unauthenticated desc = invalid token exit status 1一個個加太麻煩
我相信你肯定會問一個個加,也太麻煩了吧?有這個想法的你,應當把 type PerRPCCredentials interface 做成一個攔截器(interceptor)
總結本章節(jié)比較簡單,主要是針對 RPC 方法的自定義認證進行了介紹,如果是想做全局的,建議是舉一反三從攔截器下手哦
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/29522.html
摘要:帶入及相關介紹原文地址帶入及相關介紹項目地址作為開篇章,將會介紹相關的一些知識。 帶入gRPC:gRPC及相關介紹 原文地址:帶入gRPC:gRPC及相關介紹 項目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協(xié)議設計的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都...
摘要:原文地址帶入及相關介紹項目地址作為開篇章,將會介紹相關的一些知識。 原文地址:帶入gRPC:gRPC及相關介紹 項目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協(xié)議設計的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都是些什么?本文將會介紹一些常用的知識和概念,更詳...
摘要:帶入原文地址帶入項目地址前言本章節(jié)將介紹的流式,分為三種類型服務器端流式客戶端流式雙向流式流任何技術,因為有痛點,所以才有了存在的必要性。這一次性涉及的數(shù)據(jù)量確實大在同步完成后,也有人馬上會去查閱數(shù)據(jù),為了新的一天籌備。 帶入gRPC:gRPC Streaming, Client and Server 原文地址:帶入gRPC:gRPC Streaming, Client and Ser...
摘要:帶入基于的證書認證原文地址帶入基于的證書認證項目地址前言在上一章節(jié)中,我們提出了一個問題。其遵守標準根證書根證書是屬于根證書頒發(fā)機構的公鑰證書。目標是基于進行認證 帶入gRPC:基于 CA 的 TLS 證書認證 原文地址:帶入gRPC:基于 CA 的 TLS 證書認證項目地址:https://github.com/EDDYCJY/go... 前言 在上一章節(jié)中,我們提出了一個問題。就是...
摘要:帶入分布式鏈路追蹤原文地址帶入分布式鏈路追蹤項目地址前言在實際應用中,你做了那么多端,寫了個方法。想看看方法的指標,卻無處下手本文將通過搭建一個分布式鏈路追蹤系統(tǒng)來實現(xiàn)查看整個系統(tǒng)的鏈路性能等指標 帶入gRPC:分布式鏈路追蹤 gRPC + Opentracing + Zipkin 原文地址:帶入gRPC:分布式鏈路追蹤 gRPC + Opentracing + Zipkin項目地址:...
閱讀 3027·2023-04-26 00:32
閱讀 511·2019-08-30 15:52
閱讀 2118·2019-08-30 15:52
閱讀 3363·2019-08-30 15:44
閱讀 3292·2019-08-30 14:09
閱讀 1425·2019-08-29 15:15
閱讀 3404·2019-08-28 18:12
閱讀 1088·2019-08-26 13:55