Go-GRPC中的授权注释
我有一个GRPC服务器,其API经过授权,如: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
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
}
我想知道如何:
@Authorize(ctx=ctx,req=req,role=role.User)
func(s*MyServer)
都是API- 创建一个YAML文件,其中包含方法名到授权规则的键值对。例如
,它将转换为MyAPI:IsUserIdAuthorizedAsUser
s.IsAuthorized(ctx,req.UserId,Role.User)
- 创建一个拦截器,该拦截器在authz规则中查找请求的方法名,并调用相应的authz函数
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)
}