package api import ( "Gwen/global" "Gwen/http/request/api" "Gwen/http/response" apiResp "Gwen/http/response/api" "Gwen/model" "Gwen/service" "encoding/json" "fmt" "github.com/gin-gonic/gin" "net/http" ) type Login struct { } // Login 登录 // @Tags 登录 // @Summary 登录 // @Description 登录 // @Accept json // @Produce json // @Param body body api.LoginForm true "登录表单" // @Success 200 {object} apiResp.LoginRes // @Failure 500 {object} response.ErrorResponse // @Router /login [post] func (l *Login) Login(c *gin.Context) { f := &api.LoginForm{} err := c.ShouldBindJSON(f) //fmt.Println(f) if err != nil { global.Logger.Warn(fmt.Sprintf("Login Fail: %s %s %s", "ParamsError", c.RemoteIP(), c.ClientIP())) response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { global.Logger.Warn(fmt.Sprintf("Login Fail: %s %s %s", "ParamsError", c.RemoteIP(), c.ClientIP())) response.Error(c, errList[0]) return } u := service.AllService.UserService.InfoByUsernamePassword(f.Username, f.Password) if u.Id == 0 { global.Logger.Warn(fmt.Sprintf("Login Fail: %s %s %s", "UsernameOrPasswordError", c.RemoteIP(), c.ClientIP())) response.Error(c, response.TranslateMsg(c, "UsernameOrPasswordError")) return } //根据refer判断是webclient还是app ref := c.GetHeader("referer") if ref != "" { f.DeviceInfo.Type = "webclient" } ut := service.AllService.UserService.Login(u, &model.LoginLog{ UserId: u.Id, Client: f.DeviceInfo.Type, Uuid: f.Uuid, Ip: c.ClientIP(), Type: model.LoginLogTypeAccount, Platform: f.DeviceInfo.Os, }) c.JSON(http.StatusOK, apiResp.LoginRes{ AccessToken: ut.Token, Type: "access_token", User: *(&apiResp.UserPayload{}).FromUser(u), }) } // LoginOptions // @Tags 登录 // @Summary 登录选项 // @Description 登录选项 // @Accept json // @Produce json // @Success 200 {object} []string // @Failure 500 {object} response.ErrorResponse // @Router /login-options [post] func (l *Login) LoginOptions(c *gin.Context) { oauthOks := []string{} err, _ := service.AllService.OauthService.GetOauthConfig(model.OauthTypeGithub) if err == nil { oauthOks = append(oauthOks, model.OauthTypeGithub) } err, _ = service.AllService.OauthService.GetOauthConfig(model.OauthTypeGoogle) if err == nil { oauthOks = append(oauthOks, model.OauthTypeGoogle) } err, _ = service.AllService.OauthService.GetOauthConfig(model.OauthTypeOidc) if err == nil { oauthOks = append(oauthOks, model.OauthTypeOidc) } oauthOks = append(oauthOks, model.OauthTypeWebauth) var oidcItems []map[string]string for _, v := range oauthOks { oidcItems = append(oidcItems, map[string]string{"name": v}) } common, err := json.Marshal(oidcItems) if err != nil { response.Error(c, response.TranslateMsg(c, "SystemError")+err.Error()) return } var res []string res = append(res, "common-oidc/"+string(common)) for _, v := range oauthOks { res = append(res, "oidc/"+v) } c.JSON(http.StatusOK, res) } // Logout // @Tags 登录 // @Summary 登出 // @Description 登出 // @Accept json // @Produce json // @Success 200 {string} string // @Failure 500 {object} response.ErrorResponse // @Router /logout [post] func (l *Login) Logout(c *gin.Context) { u := service.AllService.UserService.CurUser(c) token, ok := c.Get("token") if ok { service.AllService.UserService.Logout(u, token.(string)) } c.JSON(http.StatusOK, nil) }