ai-gateway/controller/auth/wechat.go

167 lines
3.4 KiB
Go
Raw Normal View History

2024-04-05 04:10:43 +00:00
package auth
2023-04-22 12:39:27 +00:00
import (
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
2024-01-28 11:38:58 +00:00
"github.com/songquanpeng/one-api/common/config"
2024-04-21 11:43:23 +00:00
"github.com/songquanpeng/one-api/common/ctxkey"
2024-04-05 04:10:43 +00:00
"github.com/songquanpeng/one-api/controller"
2024-01-28 11:38:58 +00:00
"github.com/songquanpeng/one-api/model"
2023-04-22 12:39:27 +00:00
"net/http"
"strconv"
"time"
)
type wechatLoginResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
Data string `json:"data"`
}
func getWeChatIdByCode(code string) (string, error) {
if code == "" {
return "", errors.New("无效的参数")
}
req, err := http.NewRequest("GET", fmt.Sprintf("%s/api/wechat/user?code=%s", config.WeChatServerAddress, code), nil)
2023-04-22 12:39:27 +00:00
if err != nil {
return "", err
}
req.Header.Set("Authorization", config.WeChatServerToken)
2023-04-22 12:39:27 +00:00
client := http.Client{
Timeout: 5 * time.Second,
}
httpResponse, err := client.Do(req)
if err != nil {
return "", err
}
defer httpResponse.Body.Close()
var res wechatLoginResponse
err = json.NewDecoder(httpResponse.Body).Decode(&res)
if err != nil {
return "", err
}
if !res.Success {
return "", errors.New(res.Message)
}
if res.Data == "" {
return "", errors.New("验证码错误或已过期")
}
return res.Data, nil
}
func WeChatAuth(c *gin.Context) {
if !config.WeChatAuthEnabled {
2023-04-22 12:39:27 +00:00
c.JSON(http.StatusOK, gin.H{
"message": "管理员未开启通过微信登录以及注册",
"success": false,
})
return
}
code := c.Query("code")
wechatId, err := getWeChatIdByCode(code)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"message": err.Error(),
"success": false,
})
return
}
user := model.User{
WeChatId: wechatId,
}
if model.IsWeChatIdAlreadyTaken(wechatId) {
err := user.FillUserByWeChatId()
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
} else {
if config.RegisterEnabled {
2023-04-22 12:39:27 +00:00
user.Username = "wechat_" + strconv.Itoa(model.GetMaxUserId()+1)
user.DisplayName = "WeChat User"
2024-04-05 18:03:59 +00:00
user.Role = model.RoleCommonUser
user.Status = model.UserStatusEnabled
2023-04-22 12:39:27 +00:00
2023-06-17 10:12:58 +00:00
if err := user.Insert(0); err != nil {
2023-04-22 12:39:27 +00:00
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
} else {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "管理员关闭了新用户注册",
})
return
}
}
2024-04-05 18:03:59 +00:00
if user.Status != model.UserStatusEnabled {
2023-04-22 12:39:27 +00:00
c.JSON(http.StatusOK, gin.H{
"message": "用户已被封禁",
"success": false,
})
return
}
2024-04-05 04:10:43 +00:00
controller.SetupLogin(&user, c)
2023-04-22 12:39:27 +00:00
}
func WeChatBind(c *gin.Context) {
if !config.WeChatAuthEnabled {
2023-04-22 12:39:27 +00:00
c.JSON(http.StatusOK, gin.H{
"message": "管理员未开启通过微信登录以及注册",
"success": false,
})
return
}
code := c.Query("code")
wechatId, err := getWeChatIdByCode(code)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"message": err.Error(),
"success": false,
})
return
}
if model.IsWeChatIdAlreadyTaken(wechatId) {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "该微信账号已被绑定",
})
return
}
2024-04-21 11:43:23 +00:00
id := c.GetInt(ctxkey.Id)
2023-04-22 12:39:27 +00:00
user := model.User{
Id: id,
}
err = user.FillUserById()
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
user.WeChatId = wechatId
err = user.Update(false)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
})
return
}