| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- 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
- }
|