mirror of
https://github.com/linux-do/new-api.git
synced 2025-09-17 07:56:38 +08:00
125 lines
2.5 KiB
Go
125 lines
2.5 KiB
Go
package controller
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"io"
|
|
"net/http"
|
|
"one-api/common"
|
|
"one-api/model"
|
|
"sort"
|
|
|
|
"github.com/gin-contrib/sessions"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func TelegramBind(c *gin.Context) {
|
|
if !common.TelegramOAuthEnabled {
|
|
c.JSON(200, gin.H{
|
|
"message": "管理员未开启通过 Telegram 登录以及注册",
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
params := c.Request.URL.Query()
|
|
if !checkTelegramAuthorization(params, common.TelegramBotToken) {
|
|
c.JSON(200, gin.H{
|
|
"message": "无效的请求",
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
telegramId := params["id"][0]
|
|
if model.IsTelegramIdAlreadyTaken(telegramId) {
|
|
c.JSON(200, gin.H{
|
|
"message": "该 Telegram 账户已被绑定",
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
|
|
session := sessions.Default(c)
|
|
id := session.Get("id")
|
|
user := model.User{Id: id.(int)}
|
|
if err := user.FillUserById(); err != nil {
|
|
c.JSON(200, gin.H{
|
|
"message": err.Error(),
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
if user.Id == 0 {
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"success": false,
|
|
"message": "用户已注销",
|
|
})
|
|
return
|
|
}
|
|
user.TelegramId = telegramId
|
|
if err := user.Update(false); err != nil {
|
|
c.JSON(200, gin.H{
|
|
"message": err.Error(),
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
|
|
c.Redirect(302, "/setting")
|
|
}
|
|
|
|
func TelegramLogin(c *gin.Context) {
|
|
if !common.TelegramOAuthEnabled {
|
|
c.JSON(200, gin.H{
|
|
"message": "管理员未开启通过 Telegram 登录以及注册",
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
params := c.Request.URL.Query()
|
|
if !checkTelegramAuthorization(params, common.TelegramBotToken) {
|
|
c.JSON(200, gin.H{
|
|
"message": "无效的请求",
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
|
|
telegramId := params["id"][0]
|
|
user := model.User{TelegramId: telegramId}
|
|
if err := user.FillUserByTelegramId(); err != nil {
|
|
c.JSON(200, gin.H{
|
|
"message": err.Error(),
|
|
"success": false,
|
|
})
|
|
return
|
|
}
|
|
setupLogin(&user, c)
|
|
}
|
|
|
|
func checkTelegramAuthorization(params map[string][]string, token string) bool {
|
|
strs := []string{}
|
|
var hash = ""
|
|
for k, v := range params {
|
|
if k == "hash" {
|
|
hash = v[0]
|
|
continue
|
|
}
|
|
strs = append(strs, k+"="+v[0])
|
|
}
|
|
sort.Strings(strs)
|
|
var imploded = ""
|
|
for _, s := range strs {
|
|
if imploded != "" {
|
|
imploded += "\n"
|
|
}
|
|
imploded += s
|
|
}
|
|
sha256hash := sha256.New()
|
|
io.WriteString(sha256hash, token)
|
|
hmachash := hmac.New(sha256.New, sha256hash.Sum(nil))
|
|
io.WriteString(hmachash, imploded)
|
|
ss := hex.EncodeToString(hmachash.Sum(nil))
|
|
return hash == ss
|
|
}
|