zoukankan      html  css  js  c++  java
  • grpc-golang实现账号and密码认证

    // I would recommend to use interceptors:
    
    // client
    grpc.Dial(target, grpc.WithPerRPCCredentials(&loginCreds{
        Username: "admin",
        Password: "admin123",
    }))
    
    type loginCreds struct {
        Username, Password string
    }
    
    func (c *loginCreds) GetRequestMetadata(context.Context, ...string) (map[string]string, error) {
        return map[string]string{
            "username": c.Username,
            "password": c.Password,
        }, nil
    }
    
    func (c *loginCreds) RequireTransportSecurity() bool {
        return true
    }
    
    // server
    grpc.NewServer(
        grpc.StreamInterceptor(streamInterceptor), 
        grpc.UnaryInterceptor(unaryInterceptor)
    )
    
    func streamInterceptor(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
        if err := authorize(stream.Context()); err != nil {
            return err
        }
    
        return handler(srv, stream)
    }
    
    func unaryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
        if err := authorize(ctx); err != nil {
            return err
        }
    
        return handler(ctx, req)
    }
    
    func authorize(ctx context.Context) error {
        if md, ok := metadata.FromContext(ctx); ok {
            if len(md["username"]) > 0 && md["username"][0] == "admin" &&
                len(md["password"]) > 0 && md["password"][0] == "admin123" {
                return nil
            }
    
            return AccessDeniedErr
        }
    
        return EmptyMetadataErr
    }
  • 相关阅读:
    路由器漏洞调试的一些技巧
    路由器漏洞挖掘利用的一些基础知识
    windows 利用环境变量%PATH%中目录可写提权

    python super原理,不是指父类
    regexp盲注的一些改进
    阿里规范
    阿里规范
    工具类
    Timer 使用 (一)
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/7149374.html
Copyright © 2011-2022 走看看