Go-GRPC中的授权注释

Go-GRPC中的授权注释,go,annotations,authorization,grpc,grpc-go,Go,Annotations,Authorization,Grpc,Grpc Go,我有一个GRPC服务器,其API经过授权,如: func (s *MyServer) MyAPI(ctx context.Context, req MyAPIRequest) (MyAPIResponse, error) { isAuthorized, err = s.IsAuthorized(ctx, req.UserId, Role.User) // other APIs may use a different authorization function than IsAuthoriz

我有一个GRPC服务器,其API经过授权,如:

func (s *MyServer) MyAPI(ctx context.Context, req MyAPIRequest) (MyAPIResponse, error) {
  isAuthorized, err = s.IsAuthorized(ctx, req.UserId, Role.User) // other APIs may use a different authorization function than IsAuthorized
  if err != nil {
    return nil, err
  }
  
  if !isAuthorized {
    return nil,  status.Error(codes.PermissionDenied, "not authorized")
  }

  // rest of API code
}
我想知道如何:

  • 简化授权逻辑的使用,如注释。我对Java更为熟悉,它类似于函数上方的
    @Authorize(ctx=ctx,req=req,role=role.User)
  • 需要对API进行授权检查,以便在至少一个API缺少授权时生成失败。我在用bazel。请注意,并非所有的
    func(s*MyServer)
    都是API
  • 以下是我的想法:

    • 创建一个YAML文件,其中包含方法名到授权规则的键值对。例如
      MyAPI:IsUserIdAuthorizedAsUser
      ,它将转换为
      s.IsAuthorized(ctx,req.UserId,Role.User)
    • 创建一个拦截器,该拦截器在authz规则中查找请求的方法名,并调用相应的authz函数
  • 有一个bazel构建规则,用于解析
    rpc
    的原型文件,这些原型文件都是API方法名称,如果规则列表中不是全部,则会失败。我还不知道怎么做

  • 如果您对我的想法或更好的方法有任何建议,我将不胜感激。

    我将使用拦截器(grpc.UnaryInterceptor)来处理身份验证/授权过程。它类似于经典的spring过滤器(javaworld)

    您可以在此处阅读有关拦截器的信息:

    您可以很容易地链接多个拦截器,或者按照grpc方法使用拦截器

    下面是我几个月前写的一个拦截器(它使用JWT作为身份验证机制)。您可以将其用作示例:

    func (jwt JwtInterceptor) Interceptor(
       ctx context.Context,
       req interface{},
       info *grpc.UnaryServerInfo,
       handler grpc.UnaryHandler) (interface{}, error) {
    
        md, _ := metadata.FromIncomingContext(ctx)
    
        token := md["jwt"]
    
        if token == nil {
            return nil, errors.New("token not present")
        }
    
       apiClaims, err := jwt.decoder.Parse(token[0])
       if err != nil {
         return nil, errors.New("token signature not valid")
       }
    
       return handler(context.WithValue(ctx, "jwt", apiClaims), req)
     }