mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-15 13:02:26 +08:00
95 lines
3.4 KiB
Go
95 lines
3.4 KiB
Go
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
|
|
}
|