【问题标题】:Authorization annotations in Go GRPCGo GRPC 中的授权注解
【发布时间】:2023-03-30 00:30:01
【问题描述】:

我有一个 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
}

我想知道如何:

  1. 简化授权逻辑的使用,例如注释。我更熟悉 Java,它就像函数上方的 @Authorize(ctx = ctx, req = req, role = Role.User)
  2. 需要对 API 进行授权检查,以便在至少一个 API 缺少授权时构建失败。我正在使用巴泽尔。请注意,并非所有 func (s *MyServer) 都是 API。

这是我的想法:

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

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

【问题讨论】:

    标签: go annotations authorization grpc grpc-go


    【解决方案1】:

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

    您可以在此处阅读有关拦截器的信息:https://shijuvar.medium.com/writing-grpc-interceptors-in-go-bf3e7671fe48

    您可以轻松链接多个拦截器或为每个 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)
     }
    

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2021-05-03
      • 2016-01-29
      • 1970-01-01
      • 2015-04-19
      • 2020-01-26
      • 2018-09-18
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多