119 lines
3.4 KiB
Go
119 lines
3.4 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"go-user-service/config"
|
|
"go-user-service/libs"
|
|
"go-user-service/models"
|
|
userpb "go-user-service/proto/gen"
|
|
"go-user-service/utils"
|
|
"sync"
|
|
"time"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
type UserService struct {
|
|
userpb.UnimplementedUserServiceServer
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// 登录
|
|
func (u *UserService) Login(ctx context.Context, req *userpb.LoginRequest) (*userpb.LoginResponse, error) {
|
|
appConfig, _ := config.LoadConfig()
|
|
Snowflake, _ := utils.NewSnowflake(appConfig.WorkerID, appConfig.DatacenterID)
|
|
u.mu.RLock()
|
|
defer u.mu.RUnlock()
|
|
// 查询是否有这个用户名
|
|
var user models.User
|
|
db := libs.GetDB()
|
|
db.Model(&models.User{}).Where("username = ?", req.Username).First(&user)
|
|
if user.Username != "" {
|
|
// 验证密码
|
|
var crypto utils.Crypto
|
|
hashPassword, _ := crypto.PasswordEncryption(user.Password + user.Salt)
|
|
|
|
if user.Password == hashPassword {
|
|
token, _ := crypto.GenerateStateToken(32)
|
|
userId := Snowflake.NextID()
|
|
db.Create(&models.UserToken{
|
|
ID: int8(userId),
|
|
UserId: user.ID,
|
|
Token: token,
|
|
ExpirationTime: time.Now().Add(24 * time.Hour),
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
})
|
|
return &userpb.LoginResponse{
|
|
UserId: userId,
|
|
Username: user.Username,
|
|
Email: user.Email,
|
|
AccessToken: token,
|
|
ExpiresIn: 86400, // 1小时
|
|
}, nil
|
|
}
|
|
return nil, status.Errorf(codes.Unauthenticated, "密码错误")
|
|
}
|
|
return nil, status.Errorf(codes.NotFound, "用户不存在")
|
|
}
|
|
|
|
// 注册
|
|
func (u *UserService) Register(ctx context.Context, req *userpb.RegisterRequest) (*userpb.RegisterResponse, error) {
|
|
appConfig, _ := config.LoadConfig()
|
|
Snowflake, _ := utils.NewSnowflake(appConfig.WorkerID, appConfig.DatacenterID)
|
|
var crypto utils.Crypto
|
|
u.mu.RLock()
|
|
defer u.mu.RUnlock()
|
|
// 查询是否有这个用户名
|
|
var user models.User
|
|
db := libs.GetDB()
|
|
db.Model(&models.User{}).Where("username = ?", req.Username).First(&user)
|
|
if user.Username == req.Username {
|
|
return nil, status.Errorf(codes.AlreadyExists, "用户名已存在")
|
|
}
|
|
db.Model(&models.User{}).Where("email = ?", req.Email).First(&user)
|
|
if user.Email == req.Email {
|
|
return nil, status.Errorf(codes.AlreadyExists, "邮箱已存在")
|
|
}
|
|
userId := Snowflake.NextID()
|
|
salt := crypto.GetRandString(10)
|
|
hashPassword, _ := crypto.PasswordEncryption(req.Password + salt)
|
|
db.Create(&models.User{
|
|
ID: int8(userId),
|
|
Nickname: req.Nickname,
|
|
Username: req.Username,
|
|
Password: hashPassword,
|
|
Status: 1,
|
|
Salt: salt,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
})
|
|
return &userpb.RegisterResponse{
|
|
UserId: userId,
|
|
Username: req.Username,
|
|
Email: req.Email,
|
|
}, nil
|
|
}
|
|
|
|
// 验证token信息
|
|
func (u *UserService) ValidateToken(ctx context.Context, req *userpb.ValidateTokenRequest) (*userpb.ValidateTokenResponse, error) {
|
|
u.mu.RLock()
|
|
defer u.mu.RUnlock()
|
|
// 查询是否有这个用户名
|
|
var userToken models.UserToken
|
|
var user models.User
|
|
db := libs.GetDB()
|
|
db.Model(&models.UserToken{}).Where("token = ? and expiration_time>?", req.AccessToken, time.Now()).First(&userToken)
|
|
if userToken.Token != req.AccessToken {
|
|
return &userpb.ValidateTokenResponse{
|
|
IsValid: false,
|
|
}, nil
|
|
}
|
|
db.Model(&models.User{}).Where("id = ?", userToken.UserId).First(&user)
|
|
return &userpb.ValidateTokenResponse{
|
|
UserId: int64(userToken.UserId),
|
|
IsValid: true,
|
|
}, nil
|
|
}
|