163 lines
3.7 KiB
Go
163 lines
3.7 KiB
Go
package auth
|
|
|
|
import (
|
|
"base-go-v2/internal/api/money"
|
|
"base-go-v2/internal/db"
|
|
response "base-go-v2/internal/reponse"
|
|
"base-go-v2/internal/router"
|
|
"base-go-v2/internal/routinex"
|
|
"base-go-v2/internal/utils/idgen"
|
|
"base-go-v2/internal/utils/jwtx"
|
|
"base-go-v2/internal/utils/mapx"
|
|
"base-go-v2/internal/utils/timex"
|
|
)
|
|
|
|
func InitAuthRouter(r *router.Router) {
|
|
group := r.Group("auth")
|
|
group.POST("/login/default", loginDefault)
|
|
group.POST("/register/default", registerDefault)
|
|
group.GET("/refresh/token", RefreshAccessToken)
|
|
}
|
|
|
|
func RefreshAccessToken(c *router.Context) error {
|
|
// 从 Header 获取 Refresh Token
|
|
refreshToken := c.Header("refreshToken")
|
|
if refreshToken == "" {
|
|
return response.Fail(c).
|
|
Code(response.HttpCode.Unauthorized).
|
|
Message("未提供 Token").
|
|
Send()
|
|
}
|
|
|
|
// 验证 Refresh Token
|
|
tokenResult := jwtx.VerifyToken(refreshToken)
|
|
|
|
if !tokenResult.IsValid || tokenResult.IsExpired {
|
|
// Refresh Token 无效或过期,需要重新登录
|
|
return response.Fail(c).
|
|
Code(response.HttpCode.Unauthorized).
|
|
Message("登录已过期,请重新登录").
|
|
Send()
|
|
}
|
|
|
|
userID := tokenResult.Claims.UserID
|
|
|
|
// 生成新的 Access Token
|
|
newAccessToken, err := jwtx.CreateAccessToken(userID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return response.Success(c).
|
|
Data(newAccessToken).
|
|
Send()
|
|
}
|
|
|
|
// 默认登录
|
|
func loginDefault(c *router.Context) error {
|
|
// 获取请求体并校验必填字段
|
|
bodyData, err := c.GetBodyWithRequired("account", "password")
|
|
if err != nil {
|
|
return c.AddError(err)
|
|
}
|
|
|
|
account := bodyData.GetString("account")
|
|
password := bodyData.GetString("password")
|
|
|
|
// 查询用户
|
|
userQuery := mapx.New().SetKV(
|
|
"account", account,
|
|
"password", password,
|
|
)
|
|
user, err := db.FindOne("user_info", userQuery)
|
|
if err != nil {
|
|
return response.Success(c).Message("查询用户失败,请稍后重试").Send()
|
|
}
|
|
|
|
if user == nil {
|
|
// 账号或密码错误
|
|
return response.Fail(c).
|
|
Message("账号或密码错误").
|
|
Send()
|
|
}
|
|
|
|
userId := user.GetInt64("id")
|
|
|
|
// 创建 Access Token 和 Refresh Token
|
|
accessToken, err := jwtx.CreateAccessToken(userId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
refreshToken, err := jwtx.CreateRefreshToken(userId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 返回数据
|
|
respData := mapx.New().
|
|
SetKV(
|
|
"userId", userId,
|
|
"username", user.GetString("username"),
|
|
"seqNo", user.GetInt("seq_no"),
|
|
"gender", user.GetInt("gender"),
|
|
"token", accessToken,
|
|
"refreshToken", refreshToken,
|
|
)
|
|
|
|
routinex.Go(func() {
|
|
kv := mapx.New().SetKV(
|
|
"last_login_time", timex.NowString(),
|
|
)
|
|
_, _ = db.UpdateOne("user_info", "id", userId, kv)
|
|
})
|
|
|
|
return response.Success(c).
|
|
Data(respData).
|
|
Send()
|
|
}
|
|
|
|
func registerDefault(c *router.Context) error {
|
|
bodyData, err := c.GetBodyWithRequired("account", "password")
|
|
if err != nil {
|
|
return c.AddError(err)
|
|
}
|
|
account := bodyData.GetString("account")
|
|
password := bodyData.GetString("password")
|
|
|
|
// 构造查询条件,检查账号是否已存在
|
|
accountQuery := mapx.New().SetKV("account", account)
|
|
|
|
existingUsers, err := db.FindOne("user_info", accountQuery)
|
|
if err != nil {
|
|
return c.AddError(err)
|
|
}
|
|
|
|
if existingUsers != nil {
|
|
return response.Fail(c).Message("该账号已被注册").Send()
|
|
}
|
|
|
|
userId := idgen.NextId()
|
|
// 构造新用户数据
|
|
newUserData := mapx.New().SetKV(
|
|
"id", userId,
|
|
"account", account,
|
|
"password", password,
|
|
)
|
|
|
|
// 插入新用户
|
|
insertedRows, err := db.InsertOne("user_info", newUserData)
|
|
if err != nil {
|
|
return response.Fail(c).Message("注册失败").Send()
|
|
}
|
|
|
|
if insertedRows != 1 {
|
|
return response.Fail(c).Message("注册失败").Send()
|
|
}
|
|
|
|
err = money.InitDefaultCategories(userId)
|
|
if err != nil {
|
|
return c.AddError(err)
|
|
}
|
|
return response.Success(c).Message("注册成功").Send()
|
|
}
|