telegram.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package controller
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "encoding/hex"
  6. "io"
  7. "one-api/common"
  8. "one-api/model"
  9. "sort"
  10. "github.com/gin-contrib/sessions"
  11. "github.com/gin-gonic/gin"
  12. )
  13. func TelegramBind(c *gin.Context) {
  14. if !common.TelegramOAuthEnabled {
  15. c.JSON(200, gin.H{
  16. "message": "管理员未开启通过 Telegram 登录以及注册",
  17. "success": false,
  18. })
  19. return
  20. }
  21. params := c.Request.URL.Query()
  22. if !checkTelegramAuthorization(params, common.TelegramBotToken) {
  23. c.JSON(200, gin.H{
  24. "message": "无效的请求",
  25. "success": false,
  26. })
  27. return
  28. }
  29. telegramId := params["id"][0]
  30. if model.IsTelegramIdAlreadyTaken(telegramId) {
  31. c.JSON(200, gin.H{
  32. "message": "该 Telegram 账户已被绑定",
  33. "success": false,
  34. })
  35. return
  36. }
  37. session := sessions.Default(c)
  38. id := session.Get("id")
  39. user := model.User{Id: id.(int)}
  40. if err := user.FillUserById(); err != nil {
  41. c.JSON(200, gin.H{
  42. "message": err.Error(),
  43. "success": false,
  44. })
  45. return
  46. }
  47. user.TelegramId = telegramId
  48. if err := user.Update(false); err != nil {
  49. c.JSON(200, gin.H{
  50. "message": err.Error(),
  51. "success": false,
  52. })
  53. return
  54. }
  55. c.Redirect(302, "/setting")
  56. }
  57. func TelegramLogin(c *gin.Context) {
  58. if !common.TelegramOAuthEnabled {
  59. c.JSON(200, gin.H{
  60. "message": "管理员未开启通过 Telegram 登录以及注册",
  61. "success": false,
  62. })
  63. return
  64. }
  65. params := c.Request.URL.Query()
  66. if !checkTelegramAuthorization(params, common.TelegramBotToken) {
  67. c.JSON(200, gin.H{
  68. "message": "无效的请求",
  69. "success": false,
  70. })
  71. return
  72. }
  73. telegramId := params["id"][0]
  74. user := model.User{TelegramId: telegramId}
  75. if err := user.FillUserByTelegramId(); err != nil {
  76. c.JSON(200, gin.H{
  77. "message": err.Error(),
  78. "success": false,
  79. })
  80. return
  81. }
  82. setupLogin(&user, c)
  83. }
  84. func checkTelegramAuthorization(params map[string][]string, token string) bool {
  85. strs := []string{}
  86. var hash = ""
  87. for k, v := range params {
  88. if k == "hash" {
  89. hash = v[0]
  90. continue
  91. }
  92. strs = append(strs, k+"="+v[0])
  93. }
  94. sort.Strings(strs)
  95. var imploded = ""
  96. for _, s := range strs {
  97. if imploded != "" {
  98. imploded += "\n"
  99. }
  100. imploded += s
  101. }
  102. sha256hash := sha256.New()
  103. io.WriteString(sha256hash, token)
  104. hmachash := hmac.New(sha256.New, sha256hash.Sum(nil))
  105. io.WriteString(hmachash, imploded)
  106. ss := hex.EncodeToString(hmachash.Sum(nil))
  107. return hash == ss
  108. }