Browse Source

管理端-登录、退出接口

客户端工具类-获取token
dhy
dhy 5 months ago
parent
commit
4e47b507b0
  1. 9
      link_homework/internal/cmd/cmd.go
  2. 4
      link_homework/internal/controller/auth/login.go
  3. 33
      link_homework/internal/controller/member.go
  4. 29
      link_homework/internal/logic/login/login.go
  5. 43
      link_homework/internal/logic/login/token.go
  6. 17
      link_homework/internal/service/login.go
  7. 8
      link_homework/manifest/config/config.yaml
  8. 22
      link_homework/utility/utility.go

9
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)

4
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 无效"))
}

33
link_homework/internal/controller/member.go

@ -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,
}))
}

29
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 验证失败")
}

43
link_homework/internal/logic/login/token.go

@ -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 验证失败")
}

17
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
}

8
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

22
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")
}
Loading…
Cancel
Save