【问题标题】:unmarshall request in gRPC interceptor在 gRPC 拦截器中解组请求
【发布时间】:2019-02-14 07:39:50
【问题描述】:

为了执行授权,需要读取请求中的一些属性,以便为授权服务器进行输入

例如,这是拦截器。这里调用prepareAuthZInput 来准备输入

func AuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
     input := prepareAuthZInput(info.FullMethod, req)
}

在这个函数中,有一个很大的 if-else 部分,它检查请求的实际类型,进行类型转换,然后执行输入准备。

func prepareAuthZInput(method string, req interface{}) {
   var input Input
   if methodName = "/Data/Call" {
       callRequest, ok := req.(CallRequest)
       if ok {
          // prepare input from callRequest
       }
   } else if methodName = "/Data/Receive" {
       receiveRequest, ok := req.(ReceiveRequest)
       if ok {
          // prepare input from receiveRequest
       }

   }
   return input
}

如何改进此代码?

【问题讨论】:

  • 以什么方式提高?
  • @JoaoHenrique 除了很多 if/else 块之外,还有一些通用的东西吗?

标签: go authorization grpc


【解决方案1】:

执行此类操作时,通常将身份验证数据添加到metadata,而不是请求消息。这样服务器就不需要检查所有可能的请求负载类型。

如果您必须使用请求负载,则使用类型开关会更惯用:

switch r := req.(type) {
  case CallRequest: // r is a CallRequest...
  case ReceiveRequest: // r is a ReceiveRequest...
  default:
    return status.Errorf(codes.Unimplemented, "unknown request type: %T", req)
}

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2018-05-31
    • 1970-01-01
    • 2018-04-19
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多