设为首页 加入收藏

TOP

Fabric区块链浏览器(3)(四)
2023-09-09 10:25:39 】 浏览:323
Tags:Fabric
grpc = 2; TLS tls = 3; // 2: no auth; 1: basic auth; default: 0, token auth AuthType auth_type = 4; Auth auth = 5; } message TLS { // 是否启用tls bool enbale = 1; // 证书路径 string cert = 2; // 对应私钥路径 string key = 3; } message Log { // 日志级别设置 // 支持debug(-1)、info(0)、warn(1)、error(2)、dpanic(3)、panic(4)、fatal(5) int32 level = 1; // 日志输出格式,支持json or console string format = 2; } message Database { // 数据库类型:mysql、sqlite3、postgres string driver = 1; string source = 2; // 最大空闲连接数 int64 max_idle_conn = 3; // 最大连接数 int64 max_open_conn = 4; // 连接空闲超时参数 google.protobuf.Duration conn_max_lifetime = 5; } message Redis { string network = 1; string addr = 2; string password = 3; int32 db = 4; google.protobuf.Duration dial_timeout = 5; google.protobuf.Duration read_timeout = 6; google.protobuf.Duration write_timeout = 7; } message Data { Database database = 1; Redis redis = 2; } message Auth { // jwt 秘钥,暂未启用 string jwt_secret = 1; // token过期时间 google.protobuf.Duration expire = 2; }

5. data介绍

data中定义了AccountRepo结构,主要实现了biz中与数据库交互的业务逻辑:

type AccountRepo struct {
	data      *Data
	log       *log.Helper
	jwtSecret string
	expire    time.Duration
}

func NewAccountRepo(data *Data, logger log.Logger, auth *conf.Auth) biz.AccountRepo {
	return &AccountRepo{
		data:      data,
		log:       log.NewHelper(logger),
		jwtSecret: auth.JwtSecret,
		expire:    auth.Expire.AsDuration(),
	}
}

func genSalt() string {
	uid, _ := uuid.NewRandom()
	return uid.String()
}

func (ar *AccountRepo) Register(ctx context.Context, username, password string) (*v1.LoginResponse, error) {
	salt := genSalt()
	u := &User{
		Name:     username,
		Password: utils.CalcPassword(password, salt),
		Salt:     salt,
	}
	if err := ar.data.db.Save(u).Error; err != nil {
		ar.log.Errorf("save user data error: %s", err.Error())
		return nil, errors.Wrap(err, "save user error")
	}

	now := time.Now()
	tokenString, err := ar.genToken(uint64(u.ID), now)
	if err != nil {
		ar.log.Errorf("create token error: %s", err.Error())
		return nil, errors.Wrap(err, "create token error")
	}

	return &v1.LoginResponse{
		Token:    tokenString,
		Expire:   now.Add(ar.expire).Unix(),
		Id:       uint64(u.ID),
		Username: u.Name,
	}, nil
}
func (ar *AccountRepo) Login(ctx context.Context, username, password string) (*v1.LoginResponse, error) {
	user, err := ar.getUserByName(ctx, username)
	if err != nil {
		ar.log.Errorf("get user from data error: %s", err.Error())
		return nil, errors.Wrap(err, "GetUserByName error")
	}

	if utils.CalcPassword(password, user.Salt) != user.Password {
		ar.log.Error("user name or password is incorrect")
		return nil, errors.New("user name or password is incorrect")
	}
	now := time.Now()
	tokenString, err := ar.genToken(user.Id, now)
	if err != nil {
		ar.log.Errorf("create token error: %s", err.Error())
		return nil, errors.Wrap(err, "create token error")
	}

	return &v1.LoginResponse{
		Token:    tokenString,
		Expire:   now.Add(ar.expire).Unix(),
		Id:       user.Id,
		Username: user.Name,
	}, nil
}
func (ar *AccountRepo) RefreshToken(ctx context.Context, id uint64) (*v1.LoginResponse, error) {
	user, err := ar.getUserById(ctx, id)
	if err != nil {
		ar.log.Errorf("get user from data error: %s", err.Error())
		r
首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go 数据类型 下一篇Go 数组

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目