package web import ( "quyun/v2/app/errorx" "quyun/v2/app/http/web/dto" "quyun/v2/app/services" "quyun/v2/pkg/consts" "quyun/v2/providers/jwt" "github.com/gofiber/fiber/v3" ) // @provider type auth struct { jwt *jwt.JWT } // Login 用户登录(平台侧,非超级管理员)。 // // @Summary 用户登录 // @Tags Web // @Accept json // @Produce json // @Param form body dto.LoginForm true "form" // @Success 200 {object} dto.LoginResponse "成功" // @Router /v1/auth/login [post] // @Bind form body func (ctl *auth) login(ctx fiber.Ctx, form *dto.LoginForm) (*dto.LoginResponse, error) { m, err := services.User.FindByUsername(ctx, form.Username) if err != nil { return nil, errorx.Wrap(err).WithMsg("用户名或密码错误") } if ok := m.ComparePassword(ctx, form.Password); !ok { return nil, errorx.Wrap(errorx.ErrInvalidCredentials).WithMsg("用户名或密码错误") } token, err := ctl.jwt.CreateToken(ctl.jwt.CreateClaims(jwt.BaseClaims{ UserID: m.ID, })) if err != nil { return nil, errorx.Wrap(err).WithMsg("登录凭证生成失败") } return &dto.LoginResponse{Token: token}, nil } // Token 刷新登录凭证。 // // @Summary 刷新 Token // @Tags Web // @Accept json // @Produce json // @Success 200 {object} dto.LoginResponse "成功" // @Router /v1/auth/token [get] func (ctl *auth) token(ctx fiber.Ctx) (*dto.LoginResponse, error) { claims, ok := ctx.Locals(consts.CtxKeyClaims).(*jwt.Claims) if !ok || claims == nil || claims.UserID <= 0 { return nil, errorx.ErrTokenInvalid } token, err := ctl.jwt.CreateToken(ctl.jwt.CreateClaims(jwt.BaseClaims{ UserID: claims.UserID, })) if err != nil { return nil, errorx.Wrap(err).WithMsg("登录凭证生成失败") } return &dto.LoginResponse{Token: token}, nil }