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
    }
  • 相关阅读:
    adfs环境安装
    joinquant网站
    test
    对C转换说明符的误解以及关于数组的一些知识
    正确求平方根的整数部分方法
    单链表的交换排序法
    链表的冒泡排序
    240页345题
    C语言中对数组名取地址
    单链表的基础操作练习
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/7149374.html
Copyright © 2011-2022 走看看