成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

帶入gRPC:對 RPC 方法做自定義認證

wh469012917 / 2086人閱讀

摘要:帶入對方法做自定義認證原文地址帶入對方法做自定義認證項目地址前言在前面的章節(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
└── vendor
gRPC 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

Server
package 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

相關文章

  • 帶入gRPCgRPC及相關介紹

    摘要:帶入及相關介紹原文地址帶入及相關介紹項目地址作為開篇章,將會介紹相關的一些知識。 帶入gRPC:gRPC及相關介紹 原文地址:帶入gRPC:gRPC及相關介紹 項目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協(xié)議設計的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都...

    AJie 評論0 收藏0
  • 帶入gRPCgRPC及相關介紹

    摘要:原文地址帶入及相關介紹項目地址作為開篇章,將會介紹相關的一些知識。 原文地址:帶入gRPC:gRPC及相關介紹 項目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協(xié)議設計的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都是些什么?本文將會介紹一些常用的知識和概念,更詳...

    y1chuan 評論0 收藏0
  • 帶入gRPCgRPC Streaming, Client and Server

    摘要:帶入原文地址帶入項目地址前言本章節(jié)將介紹的流式,分為三種類型服務器端流式客戶端流式雙向流式流任何技術,因為有痛點,所以才有了存在的必要性。這一次性涉及的數(shù)據(jù)量確實大在同步完成后,也有人馬上會去查閱數(shù)據(jù),為了新的一天籌備。 帶入gRPC:gRPC Streaming, Client and Server 原文地址:帶入gRPC:gRPC Streaming, Client and Ser...

    wayneli 評論0 收藏0
  • 帶入gRPC:基于 CA 的 TLS 證書認證

    摘要:帶入基于的證書認證原文地址帶入基于的證書認證項目地址前言在上一章節(jié)中,我們提出了一個問題。其遵守標準根證書根證書是屬于根證書頒發(fā)機構的公鑰證書。目標是基于進行認證 帶入gRPC:基于 CA 的 TLS 證書認證 原文地址:帶入gRPC:基于 CA 的 TLS 證書認證項目地址:https://github.com/EDDYCJY/go... 前言 在上一章節(jié)中,我們提出了一個問題。就是...

    史占廣 評論0 收藏0
  • 帶入gRPC:分布式鏈路追蹤 gRPC-Opentracing-Zipkin

    摘要:帶入分布式鏈路追蹤原文地址帶入分布式鏈路追蹤項目地址前言在實際應用中,你做了那么多端,寫了個方法。想看看方法的指標,卻無處下手本文將通過搭建一個分布式鏈路追蹤系統(tǒng)來實現(xiàn)查看整個系統(tǒng)的鏈路性能等指標 帶入gRPC:分布式鏈路追蹤 gRPC + Opentracing + Zipkin 原文地址:帶入gRPC:分布式鏈路追蹤 gRPC + Opentracing + Zipkin項目地址:...

    BicycleWarrior 評論0 收藏0

發(fā)表評論

0條評論

wh469012917

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<