Files
workspace/code/base-project/base-go-v2/internal/api/auth/index.go
T
2025-11-07 17:29:49 +08:00

160 lines
3.6 KiB
Go

package auth
import (
"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/jwtx"
"base-go-v2/internal/utils/mapx"
"base-go-v2/internal/utils/timex"
"base-go-v2/internal/utils/uid"
)
func InitAuthRouter(r *router.Router) {
group := r.Group("auth")
group.POST("/login/default", loginDefault)
group.POST("/register/default", registerDefault)
group.POST("/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
}
// 返回新的 Access Token
respData := map[string]string{
"accessToken": newAccessToken,
}
return response.Success(c).
Data(respData).
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.GetInt("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().
SetIntToString("userId", userId).
SetKV(
"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()
}
// 构造新用户数据
newUserData := mapx.New().SetKV(
"id", uid.NextID(),
"account", account,
"password", password,
)
// 插入新用户
insertedRows, err := db.InsertOne("user_info", newUserData)
if err != nil {
}
if insertedRows != 1 {
return response.Fail(c).Message("注册失败").Send()
}
return response.Success(c).Message("注册成功").Send()
}