Files
StackChan/server/internal/service/admin_user.go
T

72 lines
1.6 KiB
Go

/*
SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
SPDX-License-Identifier: MIT
*/
package service
import (
"context"
v1 "stackChan/api/admin/v1"
"stackChan/internal/model"
"time"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/golang-jwt/jwt/v5"
)
type UserInfo struct {
Username string `json:"username"`
Password string `json:"password"`
}
func GetJwtSecret() string {
var ctx = gctx.New()
secret := g.Cfg().MustGet(ctx, "jwt.secret").String()
return secret
}
func AdminLogin(ctx context.Context, req *v1.AdminLoginReq) (res *v1.AdminLoginRes, err error) {
users, err := LoadUserConfig()
if err != nil {
return nil, err
}
var matched *UserInfo
for _, user := range users {
if user.Username == req.UserName && user.Password == req.Password {
matched = &user
break
}
}
if matched == nil {
return nil, gerror.NewCode(gcode.CodeNotAuthorized)
}
claims := jwt.MapClaims{
model.Username: matched.Username,
model.Exp: time.Now().Add(24 * time.Hour).Unix(),
}
tokenObj := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
jwtSecret := GetJwtSecret()
if jwtSecret == "" {
return nil, gerror.NewCode(gcode.CodeInternalError)
}
token, err := tokenObj.SignedString([]byte(jwtSecret))
if err != nil {
return nil, err
}
res = &v1.AdminLoginRes{
Token: token,
}
return res, nil
}
func LoadUserConfig() ([]UserInfo, error) {
var ctx = gctx.New()
var users []UserInfo
err := g.Cfg().MustGet(ctx, "admin.users").Scan(&users)
return users, err
}