mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-03-01 00:35:36 +08:00
init commit
This commit is contained in:
94
water/service/auth_service.go
Normal file
94
water/service/auth_service.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
providerApiEntity "flswld.com/annie-user-api/entity"
|
||||
"flswld.com/common/utils/endec"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
"strconv"
|
||||
"time"
|
||||
"water/entity"
|
||||
)
|
||||
|
||||
func (s *Service) generateAccessToken(user *providerApiEntity.User) (*entity.AccessToken, error) {
|
||||
accessToken, err := s.dao.InsertAccessToken(&entity.AccessToken{
|
||||
Uid: user.Uid,
|
||||
Username: user.Username,
|
||||
AccessToken: uuid.NewV4().String(),
|
||||
CreateTime: strconv.FormatInt(time.Now().Unix(), 10),
|
||||
})
|
||||
return accessToken, err
|
||||
}
|
||||
|
||||
func (s *Service) generateRefreshToken(user *providerApiEntity.User) (*entity.RefreshToken, error) {
|
||||
refreshToken, err := s.dao.InsertRefreshToken(&entity.RefreshToken{
|
||||
Uid: user.Uid,
|
||||
Username: user.Username,
|
||||
RefreshToken: uuid.NewV4().String(),
|
||||
CreateTime: strconv.FormatInt(time.Now().Unix(), 10),
|
||||
})
|
||||
return refreshToken, err
|
||||
}
|
||||
|
||||
func (s *Service) LoginAuth(user *providerApiEntity.User) (string, string, error) {
|
||||
userList := make([]providerApiEntity.User, 0)
|
||||
// 用户服务
|
||||
ok := s.rpcUserConsumer.CallFunction("RpcService", "RpcQueryUser", &providerApiEntity.User{Username: user.Username}, &userList)
|
||||
if !ok || len(userList) != 1 {
|
||||
return "", "", errors.New("query username error")
|
||||
}
|
||||
if userList[0].Password != endec.Md5Str(user.Password) {
|
||||
return "", "", errors.New("password error")
|
||||
}
|
||||
accessToken, err := s.generateAccessToken(&providerApiEntity.User{Uid: userList[0].Uid, Username: userList[0].Username})
|
||||
if err != nil {
|
||||
return "", "", errors.New("generate access token error")
|
||||
}
|
||||
refreshToken, err := s.generateRefreshToken(&providerApiEntity.User{Uid: userList[0].Uid, Username: userList[0].Username})
|
||||
if err != nil {
|
||||
return "", "", errors.New("generate refresh token error")
|
||||
}
|
||||
return accessToken.AccessToken, refreshToken.RefreshToken, nil
|
||||
}
|
||||
|
||||
func (s *Service) VerifyAccessToken(accessToken string) bool {
|
||||
tokenList, err := s.dao.QueryAccessToken(&entity.AccessToken{AccessToken: accessToken})
|
||||
if err != nil || len(tokenList) == 0 {
|
||||
return false
|
||||
}
|
||||
createTime, err := strconv.ParseInt(tokenList[0].CreateTime, 10, 64)
|
||||
if err != nil || (time.Now().Unix()-createTime) > 1800 {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *Service) QueryUserByAccessToken(accessToken string) (*providerApiEntity.User, error) {
|
||||
tokenList, err := s.dao.QueryAccessToken(&entity.AccessToken{AccessToken: accessToken})
|
||||
if err != nil || len(tokenList) != 1 {
|
||||
return nil, errors.New("query access token error")
|
||||
}
|
||||
userList := make([]providerApiEntity.User, 0)
|
||||
// 用户服务
|
||||
ok := s.rpcUserConsumer.CallFunction("RpcService", "RpcQueryUser", &providerApiEntity.User{Uid: tokenList[0].Uid}, &userList)
|
||||
if !ok || len(userList) != 1 {
|
||||
return nil, errors.New("query user error")
|
||||
}
|
||||
return &(userList[0]), nil
|
||||
}
|
||||
|
||||
func (s *Service) RefreshToken(refreshToken string) (string, error) {
|
||||
tokenList, err := s.dao.QueryRefreshToken(&entity.RefreshToken{RefreshToken: refreshToken})
|
||||
if err != nil || len(tokenList) == 0 {
|
||||
return "", errors.New("query refresh token error")
|
||||
}
|
||||
createTime, err := strconv.ParseInt(tokenList[0].CreateTime, 10, 64)
|
||||
if err != nil || (time.Now().Unix()-createTime) > 24*3600 {
|
||||
return "", errors.New("refresh token overtime")
|
||||
}
|
||||
accessToken, err := s.generateAccessToken(&providerApiEntity.User{Uid: tokenList[0].Uid, Username: tokenList[0].Username})
|
||||
if err != nil {
|
||||
return "", errors.New("generate access token error")
|
||||
}
|
||||
return accessToken.AccessToken, nil
|
||||
}
|
||||
34
water/service/memory_token_service.go
Normal file
34
water/service/memory_token_service.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
providerApiEntity "flswld.com/annie-user-api/entity"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
"water/entity"
|
||||
)
|
||||
|
||||
func (s *Service) GetMemoryToken(login *entity.Login) (auth bool, token string) {
|
||||
user := new(providerApiEntity.User)
|
||||
// 用户服务
|
||||
_ = s.rpcUserConsumer.CallFunction("Service", "LoadUserByUserName", login.Username, user)
|
||||
if user.Uid != 0 {
|
||||
if login.Password == user.Password {
|
||||
auth = true
|
||||
token = uuid.NewV4().String()
|
||||
s.userTokenMap[token] = user.Uid
|
||||
} else {
|
||||
auth = false
|
||||
}
|
||||
} else {
|
||||
auth = false
|
||||
}
|
||||
return auth, token
|
||||
}
|
||||
|
||||
func (s *Service) CheckMemoryToken(token string) (valid bool, uid uint64) {
|
||||
uid = s.userTokenMap[token]
|
||||
if uid != 0 {
|
||||
return true, uid
|
||||
} else {
|
||||
return false, 0
|
||||
}
|
||||
}
|
||||
27
water/service/rpc_auth_service.go
Normal file
27
water/service/rpc_auth_service.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
providerApiEntity "flswld.com/annie-user-api/entity"
|
||||
"flswld.com/common/utils/object"
|
||||
)
|
||||
|
||||
func (s *RpcService) RpcVerifyAccessToken(accessToken string, res *bool) error {
|
||||
valid := s.service.VerifyAccessToken(accessToken)
|
||||
err := object.ObjectDeepCopy(valid, res)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *RpcService) RpcQueryUserByAccessToken(accessToken string, res *providerApiEntity.User) error {
|
||||
user, err := s.service.QueryUserByAccessToken(accessToken)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = object.ObjectDeepCopy(user, res)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
18
water/service/rpc_service.go
Normal file
18
water/service/rpc_service.go
Normal file
@@ -0,0 +1,18 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"water/dao"
|
||||
)
|
||||
|
||||
type RpcService struct {
|
||||
dao *dao.Dao
|
||||
service *Service
|
||||
}
|
||||
|
||||
// 构造函数
|
||||
func NewRpcService(dao *dao.Dao, service *Service) (r *RpcService) {
|
||||
r = new(RpcService)
|
||||
r.service = service
|
||||
r.dao = dao
|
||||
return r
|
||||
}
|
||||
23
water/service/service.go
Normal file
23
water/service/service.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"flswld.com/light"
|
||||
"water/dao"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
dao *dao.Dao
|
||||
rpcUserConsumer *light.Consumer
|
||||
// token map
|
||||
// map[token]uid
|
||||
userTokenMap map[string]uint64
|
||||
}
|
||||
|
||||
// 构造函数
|
||||
func NewService(dao *dao.Dao, rpcUserConsumer *light.Consumer) (r *Service) {
|
||||
r = new(Service)
|
||||
r.rpcUserConsumer = rpcUserConsumer
|
||||
r.userTokenMap = make(map[string]uint64)
|
||||
r.dao = dao
|
||||
return r
|
||||
}
|
||||
Reference in New Issue
Block a user