diff --git a/link_homework/internal/cmd/cmd.go b/link_homework/internal/cmd/cmd.go index f9eafdb..a8521be 100644 --- a/link_homework/internal/cmd/cmd.go +++ b/link_homework/internal/cmd/cmd.go @@ -5,7 +5,6 @@ import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gcmd" - member "link_homework/internal/controller" "link_homework/internal/controller/auth" "link_homework/internal/logic/middleware" ) @@ -19,10 +18,10 @@ var ( s := g.Server() //后台 s.Group("/api", func(group *ghttp.RouterGroup) { - group.POST("/", auth.NewLoginController()) - group.POST("/api/v2/member", new(member.MemberController)) - //group.POST("/login", login.NewLoginLogic()) - //group.POST("/logout", login.NewTokenLogic()) + // 登录接口 + group.POST("/login", auth.NewLoginController().Login) + // 退出接口 + group.POST("/logout", auth.NewLoginController().Logout) }) s.Group("/api/homework_manage", func(group *ghttp.RouterGroup) { group.Middleware(middleware.JWTMiddleware) diff --git a/link_homework/internal/controller/auth/login.go b/link_homework/internal/controller/auth/login.go index d088d14..cb22fbb 100644 --- a/link_homework/internal/controller/auth/login.go +++ b/link_homework/internal/controller/auth/login.go @@ -40,13 +40,13 @@ func (c *LoginController) Logout(r *ghttp.Request) { ctx := r.Context() // 从请求头中获取 token - token := r.Header.Get("Authorization") + token := r.Header.Get("token") if token == "" { r.Response.WriteJsonExit(dto.ErrorWithCode(http.StatusUnauthorized, "Token 不能为空")) } // 校验 Token 是否有效 - valid, err := service.TokenLogic().ValidateToken(ctx, token) + valid, err := service.LoginLogic().ValidateToken(ctx, token) if err != nil || !valid { r.Response.WriteJsonExit(dto.ErrorWithCode(http.StatusUnauthorized, "Token 无效")) } diff --git a/link_homework/internal/controller/member.go b/link_homework/internal/controller/member.go deleted file mode 100644 index fa0a53e..0000000 --- a/link_homework/internal/controller/member.go +++ /dev/null @@ -1,33 +0,0 @@ -package member - -import ( - "github.com/gogf/gf/v2/net/ghttp" - "link_homework/internal/model/dto" - "link_homework/utility" -) - -// MemberController 处理与成员相关的操作 -type MemberController struct{} - -// GetJwcode 获取用户的 jwcode -// MemberController.GetJwcode -func (c *MemberController) GetJwcode(r *ghttp.Request) { - // 获取 token 参数 - token := r.Get("token").String() - if token == "" { - r.Response.WriteJsonExit(dto.Error("Token is required")) - return - } - - // 调用 GetJwcodeJSON 函数获取 jwcode - result := utility.GetJwcodeJSON(token) - if result.Code != 200 { - r.Response.WriteJsonExit(result) // 直接返回错误结果 - return - } - - // 成功返回 jwcode - r.Response.WriteJsonExit(dto.SuccessWithData(map[string]interface{}{ - "jwcode": result.Data, - })) -} diff --git a/link_homework/internal/logic/login/login.go b/link_homework/internal/logic/login/login.go index 4502b67..4752a2a 100644 --- a/link_homework/internal/logic/login/login.go +++ b/link_homework/internal/logic/login/login.go @@ -3,16 +3,16 @@ package login import ( "context" "errors" - "link_homework/internal/service" "time" "github.com/golang-jwt/jwt/v4" + "link_homework/internal/service" ) type sLoginLogic struct{} var ( - SecretKey = []byte("HomilyLink") // 用于签名 JWT 的密钥 + SecretKey = []byte("HomilyLink") // 用于签名和验证 JWT 的密钥 ) // 自定义声明结构 @@ -30,6 +30,7 @@ func init() { service.RegisterLoginLogic(&sLoginLogic{}) } +// Login 方法实现用户登录并生成 Token func (l *sLoginLogic) Login(ctx context.Context, username, password string) (string, error) { if username != "admin" || password != "12345" { return "", errors.New("用户名或密码错误") @@ -49,3 +50,27 @@ func (l *sLoginLogic) Login(ctx context.Context, username, password string) (str return tokenString, nil } + +// ValidateToken 验证 Token 是否有效 +func (l *sLoginLogic) ValidateToken(ctx context.Context, tokenString string) (bool, error) { + // 解析 token + token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return SecretKey, nil + }) + + if err != nil { + return false, errors.New("Token 无效: " + err.Error()) + } + + // 如果 token 有效,返回 true + if token.Valid { + // 提取 CustomClaims 并打印 username + //if claims, ok := token.Claims.(*CustomClaims); ok { + // log.Printf("解析到的用户名: %s", claims.Username) // 打印解析到的用户名 + //} + return true, nil + } + + // 如果 token 无效 + return false, errors.New("Token 验证失败") +} diff --git a/link_homework/internal/logic/login/token.go b/link_homework/internal/logic/login/token.go deleted file mode 100644 index 72ff438..0000000 --- a/link_homework/internal/logic/login/token.go +++ /dev/null @@ -1,43 +0,0 @@ -package login - -import ( - "context" - "errors" - "github.com/golang-jwt/jwt/v4" - "link_homework/internal/service" - "log" -) - -type sTokenLogic struct{} - -func NewTokenLogic() *sTokenLogic { - return &sTokenLogic{} -} - -func init() { - service.RegisterTokenLogic(&sTokenLogic{}) -} - -// ValidateToken 验证 JWT Token 的方法 -func (t *sTokenLogic) ValidateToken(ctx context.Context, tokenString string) (bool, error) { - // 解析 token - token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { - return SecretKey, nil - }) - - if err != nil { - return false, errors.New("Token 无效: " + err.Error()) - } - - // 如果 token 有效,返回 true - if token.Valid { - // 提取 CustomClaims 并打印 username - if claims, ok := token.Claims.(*CustomClaims); ok { - log.Printf("解析到的用户名: %s", claims.Username) // 打印解析到的用户名 - } - return true, nil - } - - // 如果 token 无效 - return false, errors.New("Token 验证失败") -} diff --git a/link_homework/internal/service/login.go b/link_homework/internal/service/login.go index b8da34e..e49b489 100644 --- a/link_homework/internal/service/login.go +++ b/link_homework/internal/service/login.go @@ -11,17 +11,15 @@ import ( type ( ILoginLogic interface { + // Login 方法实现用户登录并生成 Token Login(ctx context.Context, username string, password string) (string, error) - } - ITokenLogic interface { - // ValidateToken 验证 JWT Token 的方法 + // ValidateToken 验证 Token 是否有效 ValidateToken(ctx context.Context, tokenString string) (bool, error) } ) var ( localLoginLogic ILoginLogic - localTokenLogic ITokenLogic ) func LoginLogic() ILoginLogic { @@ -34,14 +32,3 @@ func LoginLogic() ILoginLogic { func RegisterLoginLogic(i ILoginLogic) { localLoginLogic = i } - -func TokenLogic() ITokenLogic { - if localTokenLogic == nil { - panic("implement not found for interface ITokenLogic, forgot register?") - } - return localTokenLogic -} - -func RegisterTokenLogic(i ITokenLogic) { - localTokenLogic = i -} diff --git a/link_homework/manifest/config/config.yaml b/link_homework/manifest/config/config.yaml index 642bcce..0df5265 100644 --- a/link_homework/manifest/config/config.yaml +++ b/link_homework/manifest/config/config.yaml @@ -23,10 +23,10 @@ database: redis: default: -# address: "39.101.133.168:7001" -# password: "test" - address: "127.0.0.1:6379" - password: "" + address: "39.101.133.168:7001" + pass: "test" +# address: "127.0.0.1:6379" +# password: "" db: 0 diff --git a/link_homework/utility/utility.go b/link_homework/utility/utility.go index c09c6da..513bfc1 100644 --- a/link_homework/utility/utility.go +++ b/link_homework/utility/utility.go @@ -2,6 +2,8 @@ package utility import ( "encoding/json" + "errors" + "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" "io/ioutil" @@ -58,11 +60,11 @@ func selectBaseUrl(hashKey string) *dto.Result { } // 获取 jwcode -func GetJwcodeJSON(token string) *dto.Result { +func GetJwcodeJSON(token string) (string, error) { // 1. 获取基础 URL urlResult := getUrl(consts.URL_KEY, consts.URL_HASH_KEY) if urlResult.Code != 200 { - return urlResult // 如果获取 URL 失败,直接返回错误 + return "", errors.New("获取基础 URL 失败: " + urlResult.Message) } baseUrl := urlResult.Data.(string) @@ -73,7 +75,7 @@ func GetJwcodeJSON(token string) *dto.Result { // 3. 创建 HTTP 请求 req, err := http.NewRequest("POST", url, requestBody) if err != nil { - return dto.Error("HTTP 请求创建失败: " + err.Error()) + return "", fmt.Errorf("HTTP 请求创建失败: %v", err) } req.Header.Set("Content-Type", "application/json") @@ -81,33 +83,33 @@ func GetJwcodeJSON(token string) *dto.Result { client := &http.Client{} resp, err := client.Do(req) if err != nil { - return dto.Error("HTTP 请求失败: " + err.Error()) + return "", fmt.Errorf("HTTP 请求失败: %v", err) } defer resp.Body.Close() // 5. 检查 HTTP 状态码 if resp.StatusCode != http.StatusOK { - return dto.Error("HTTP 状态码错误: " + resp.Status) + return "", fmt.Errorf("HTTP 状态码错误: %v", resp.Status) } // 6. 读取并解析响应体 body, err := ioutil.ReadAll(resp.Body) if err != nil { - return dto.Error("读取响应失败: " + err.Error()) + return "", fmt.Errorf("读取响应失败: %v", err) } // 7. 解析 JSON 数据 var jsonResponse map[string]interface{} if err = json.Unmarshal(body, &jsonResponse); err != nil { - return dto.Error("解析 JSON 失败: " + err.Error()) + return "", fmt.Errorf("解析 JSON 失败: %v", err) } - // 8. 提取 jwcode + // 8. 提取并直接返回 jwcode if data, ok := jsonResponse["data"].(map[string]interface{}); ok { if jwcode, exists := data["jwcode"].(string); exists { - return dto.SuccessWithData(g.Map{"jwcode": jwcode}) + return jwcode, nil // 直接返回 jwcode } } - return dto.Error("响应体中没有 jwcode") + return "", errors.New("响应体中没有 jwcode") }