2017-02-08 21 views
2

grpcのサーバー側でメタデータ(ヘッダーとして渡される)を読み取る方法は?ゴランの例?サーバサイドでgrpcのメタデータを読み込む方法は? (ゴランの例)

私はこのような何か書いている:私は、受信したトークンを検証するために、私の検証機能に認証トークンを渡したい

// this should be passed from the client side as a context and needs to accessed on server side to read the metadata 
var headers = metadata.New(map[string]string{"authorization": "", "space": "", "org": "", "limit": "", "offset": ""}) 

を。

func validate_token(ctx context.Context, md *metadata.MD) (context.Context, error){ 
    token := headers["authorization"] 
} 

答えて

7

サーバーを呼び出す前に、メタデータをクライアントのコンテキストに挿入する必要があります。

単項RPCのクライアント側は、次のようになります。ストリームの場合

conn, _ := grpc.Dial(address, opts...) 
client := NewMyClient(conn) // generated from your proto with the grpc protoc option 

header := metadata.New(map[string]string{"authorization": "", "space": "", "org": "", "limit": "", "offset": ""}) 
// this is the critical step that includes your headers 
ctx := metadata.NewContext(context.Background(), header) 

request := // construct a request for your service 
response, err := client.MyMethod(ctx, request) 

、それはほぼ同じになります。単項RPC用のサーバー側で

conn, _ := grpc.Dial(address, opts...) 
client := NewMyClient(conn) // generated from your proto with the grpc protoc option 

header := metadata.New(map[string]string{"authorization": "", "space": "", "org": "", "limit": "", "offset": ""}) 
// this is the critical step that includes your headers 
ctx := metadata.NewContext(context.Background(), header) 
stream, err := client.MyMethodStream(ctx) 

for { 
    request := // construct a request for your service 
    err := stream.Send(request) 
    response := new(Response) 
    err = stream.RecvMsg(response) 
} 

func (s myServer) MyMethod(context.Context, *Request) (*Response, error) { 
    headers, ok := metadata.FromContext(ctx) 
    token := headers["authorization"] 
} 

およびtreamingのRPC:最初のストリームを開くために使用されるコンテキストにgrpc.SendHeader、及びgrpc.SetTrailer介し:ストリームのヘッダーを送信することができる唯一の3倍存在すること

func (s myServer) MyMethodStream(stream MyMethod_MyServiceStreamServer) error { 
    headers, ok := metadata.FromContext(stream.Context()) 
    token := headers["authorization"] 
    for { 
     request := new(Request) 
     err := stream.RecvMsg(request) 
     // do work 
     err := stream.SendMsg(response) 
    } 
} 

注意。ストリーム内の任意のメッセージにヘッダーを設定することはできません。単一のRPCヘッダーの場合は、すべてのメッセージと共に送信され、grpc.SendHeaderとgrpc.SetHeader、およびgrpc.SetTrailerを使用して初期コンテキストで設定できます。

関連する問題