381 lines
10 KiB
Go
381 lines
10 KiB
Go
package controllers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"strings"
|
|
|
|
"server/models"
|
|
"server/pkg/jwtutil"
|
|
"server/services"
|
|
|
|
beego "github.com/beego/beego/v2/server/web"
|
|
)
|
|
|
|
// AppAuthController App移动端认证控制器
|
|
type AppAuthController struct {
|
|
beego.Controller
|
|
}
|
|
|
|
func (c *AppAuthController) serveJSON(data map[string]interface{}) {
|
|
c.Data["json"] = data
|
|
_ = c.ServeJSON()
|
|
}
|
|
|
|
// LoginBackend App端登录(需要租户)
|
|
func (c *AppAuthController) LoginBackend() {
|
|
var req struct {
|
|
TenantName string `json:"tenant_name"`
|
|
Account string `json:"account"`
|
|
Password string `json:"password"`
|
|
Code string `json:"code"`
|
|
}
|
|
|
|
body := c.Ctx.Input.RequestBody
|
|
if len(body) == 0 {
|
|
var err error
|
|
body, err = io.ReadAll(c.Ctx.Request.Body)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
}
|
|
if len(body) == 0 {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
if err := json.Unmarshal(body, &req); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
|
|
req.TenantName = strings.TrimSpace(req.TenantName)
|
|
req.Account = strings.TrimSpace(req.Account)
|
|
req.Password = strings.TrimSpace(req.Password)
|
|
if req.TenantName == "" || req.Account == "" || req.Password == "" {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "租户名称、用户名或密码不能为空"})
|
|
return
|
|
}
|
|
|
|
token, loginUser, err := services.BackendLogin(req.TenantName, req.Account, req.Password)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 401, "msg": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "登录成功",
|
|
"data": map[string]interface{}{
|
|
"token": token,
|
|
"user": map[string]interface{}{
|
|
"id": loginUser.ID,
|
|
"account": loginUser.Account,
|
|
"name": loginUser.Name,
|
|
"tid": loginUser.Tid,
|
|
"rid": loginUser.Rid,
|
|
"avatar": loginUser.Avatar,
|
|
"role_name": loginUser.RoleName,
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
// GetCurrentUser App端当前登录用户信息,需 Bearer Token
|
|
func (c *AppAuthController) GetCurrentUser() {
|
|
authHeader := c.Ctx.Request.Header.Get("Authorization")
|
|
if authHeader == "" {
|
|
c.serveJSON(map[string]interface{}{"code": 401, "msg": "未登录"})
|
|
return
|
|
}
|
|
authParts := strings.SplitN(authHeader, " ", 2)
|
|
if len(authParts) != 2 || authParts[0] != "Bearer" {
|
|
c.serveJSON(map[string]interface{}{"code": 401, "msg": "认证信息格式错误"})
|
|
return
|
|
}
|
|
claims, err := jwtutil.ParseToken(authParts[1])
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 401, "msg": "无效的token"})
|
|
return
|
|
}
|
|
if claims.UserType != "backend" && claims.UserType != "app" {
|
|
c.serveJSON(map[string]interface{}{"code": 403, "msg": "无权访问"})
|
|
return
|
|
}
|
|
|
|
var tenantUser models.SystemTenantUser
|
|
err = models.Orm.QueryTable(new(models.SystemTenantUser)).
|
|
Filter("uid", claims.UserID).
|
|
Filter("tid", claims.TenantId).
|
|
One(&tenantUser)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 401, "msg": "用户不存在"})
|
|
return
|
|
}
|
|
if tenantUser.Status == 0 {
|
|
c.serveJSON(map[string]interface{}{"code": 401, "msg": "账号已禁用"})
|
|
return
|
|
}
|
|
|
|
account := ""
|
|
if tenantUser.Account != nil {
|
|
account = strings.TrimSpace(*tenantUser.Account)
|
|
}
|
|
name := ""
|
|
if tenantUser.Name != nil {
|
|
name = strings.TrimSpace(*tenantUser.Name)
|
|
}
|
|
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "success",
|
|
"data": map[string]interface{}{
|
|
"id": tenantUser.Uid,
|
|
"account": account,
|
|
"name": name,
|
|
"tid": tenantUser.Tid,
|
|
"rid": 0,
|
|
"avatar": "",
|
|
"role_name": "",
|
|
},
|
|
})
|
|
}
|
|
|
|
// SendLoginCode 发送App端登录验证码
|
|
func (c *AppAuthController) SendLoginCode() {
|
|
var req struct {
|
|
Account string `json:"account"`
|
|
TenantName string `json:"tenant_name"`
|
|
Channel string `json:"channel"`
|
|
}
|
|
body := c.Ctx.Input.RequestBody
|
|
if len(body) == 0 {
|
|
var err error
|
|
body, err = io.ReadAll(c.Ctx.Request.Body)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
}
|
|
if err := json.Unmarshal(body, &req); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
|
|
cfg, _ := models.GetPlatformLoginVerify()
|
|
if cfg.OpenVerifyEnabled != 1 {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "当前未开启验证"})
|
|
return
|
|
}
|
|
channel := strings.TrimSpace(req.Channel)
|
|
if channel == "" {
|
|
channel = cfg.VerifyType
|
|
}
|
|
if channel != "sms" && channel != "email" {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "仅支持短信/邮箱验证码"})
|
|
return
|
|
}
|
|
if err := services.SendBackendLoginCode(req.TenantName, req.Account, channel); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": err.Error()})
|
|
return
|
|
}
|
|
c.serveJSON(map[string]interface{}{"code": 200, "msg": "验证码已发送"})
|
|
}
|
|
|
|
// LoginBySms App端手机号验证码登录(占位实现)
|
|
func (c *AppAuthController) LoginBySms() {
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 501,
|
|
"msg": "手机号验证码登录暂未实现",
|
|
})
|
|
}
|
|
|
|
// Logout App端退出登录(当前为无状态直接返回成功)
|
|
func (c *AppAuthController) Logout() {
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "退出成功",
|
|
})
|
|
}
|
|
|
|
// GetGeetest3Infos 获取App端极验3.0配置
|
|
func (c *AppAuthController) GetGeetest3Infos() {
|
|
cfg, _ := models.GetPlatformLoginVerify()
|
|
if cfg.Geetest3ID == nil || cfg.Geetest3Key == nil {
|
|
c.serveJSON(map[string]interface{}{"code": 404, "msg": "未配置极验3参数"})
|
|
return
|
|
}
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "success",
|
|
"data": map[string]interface{}{
|
|
"captcha_id": *cfg.Geetest3ID,
|
|
"captcha_key": *cfg.Geetest3Key,
|
|
},
|
|
})
|
|
}
|
|
|
|
// GetGeetest4Infos 获取App端极验4.0配置
|
|
func (c *AppAuthController) GetGeetest4Infos() {
|
|
cfg, _ := models.GetPlatformLoginVerify()
|
|
if cfg.Geetest4ID == nil || cfg.Geetest4Key == nil {
|
|
c.serveJSON(map[string]interface{}{"code": 404, "msg": "未配置极验4参数"})
|
|
return
|
|
}
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "success",
|
|
"data": map[string]interface{}{
|
|
"captcha_id": *cfg.Geetest4ID,
|
|
"captcha_key": *cfg.Geetest4Key,
|
|
},
|
|
})
|
|
}
|
|
|
|
// GetOpenVerify 判断是否开启App端登录验证
|
|
func (c *AppAuthController) GetOpenVerify() {
|
|
cfg, _ := models.GetPlatformLoginVerify()
|
|
openVerify := "0"
|
|
if cfg.OpenVerifyEnabled == 1 {
|
|
openVerify = "1"
|
|
}
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "ok",
|
|
"data": []map[string]string{
|
|
{
|
|
"label": "openVerify",
|
|
"value": openVerify,
|
|
},
|
|
{
|
|
"label": "verifyType",
|
|
"value": cfg.VerifyType,
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
// VerifyAccount 验证租户和账号是否存在(忘记密码第一步)
|
|
func (c *AppAuthController) VerifyAccount() {
|
|
var req struct {
|
|
TenantName string `json:"tenant_name"`
|
|
Account string `json:"account"`
|
|
}
|
|
body := c.Ctx.Input.RequestBody
|
|
if len(body) == 0 {
|
|
var err error
|
|
body, err = io.ReadAll(c.Ctx.Request.Body)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
}
|
|
if err := json.Unmarshal(body, &req); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
|
|
phone, email, err := services.VerifyTenantAccount(req.TenantName, req.Account)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "验证成功",
|
|
"data": map[string]interface{}{
|
|
"phone": phone,
|
|
"email": email,
|
|
},
|
|
})
|
|
}
|
|
|
|
// SendResetCode 发送找回密码验证码(忘记密码第二步)
|
|
func (c *AppAuthController) SendResetCode() {
|
|
var req struct {
|
|
TenantName string `json:"tenant_name"`
|
|
Account string `json:"account"`
|
|
Phone string `json:"phone"`
|
|
Channel string `json:"channel"`
|
|
}
|
|
body := c.Ctx.Input.RequestBody
|
|
if len(body) == 0 {
|
|
var err error
|
|
body, err = io.ReadAll(c.Ctx.Request.Body)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
}
|
|
if err := json.Unmarshal(body, &req); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
|
|
channel := strings.TrimSpace(req.Channel)
|
|
if channel == "" {
|
|
channel = "sms"
|
|
}
|
|
|
|
if err := services.SendResetCode(req.TenantName, req.Account, req.Phone, channel); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "验证码已发送",
|
|
})
|
|
}
|
|
|
|
// ResetPassword 重置密码(忘记密码第三步)
|
|
func (c *AppAuthController) ResetPassword() {
|
|
var req struct {
|
|
TenantName string `json:"tenant_name"`
|
|
Account string `json:"account"`
|
|
Phone string `json:"phone"`
|
|
SmsCode string `json:"sms_code"`
|
|
NewPassword string `json:"new_password"`
|
|
ConfirmPassword string `json:"confirm_password"`
|
|
}
|
|
body := c.Ctx.Input.RequestBody
|
|
if len(body) == 0 {
|
|
var err error
|
|
body, err = io.ReadAll(c.Ctx.Request.Body)
|
|
if err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
}
|
|
if err := json.Unmarshal(body, &req); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": "参数错误"})
|
|
return
|
|
}
|
|
|
|
if err := services.ResetPassword(req.TenantName, req.Account, req.Phone, req.SmsCode, req.NewPassword, req.ConfirmPassword); err != nil {
|
|
c.serveJSON(map[string]interface{}{"code": 400, "msg": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 200,
|
|
"msg": "密码重置成功",
|
|
})
|
|
}
|
|
|
|
// Register App端注册(占位实现)
|
|
func (c *AppAuthController) Register() {
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 501,
|
|
"msg": "注册暂未实现",
|
|
})
|
|
}
|
|
|
|
// SendRegisterCode 发送App端注册验证码(占位实现)
|
|
func (c *AppAuthController) SendRegisterCode() {
|
|
c.serveJSON(map[string]interface{}{
|
|
"code": 501,
|
|
"msg": "发送注册验证码暂未实现",
|
|
})
|
|
} |