mirror of
https://github.com/m5stack/StackChan.git
synced 2026-04-27 19:12:40 +00:00
72 lines
1.6 KiB
Go
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
|
|
}
|