set_token_logic.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package fastgpt
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/golang-jwt/jwt/v5"
  8. "github.com/suyuan32/simple-admin-core/rpc/types/core"
  9. "net/http"
  10. "strconv"
  11. "github.com/zeromicro/go-zero/core/logx"
  12. "wechat-api/internal/svc"
  13. "wechat-api/internal/types"
  14. )
  15. type SetTokenLogic struct {
  16. logx.Logger
  17. ctx context.Context
  18. svcCtx *svc.ServiceContext
  19. rw http.ResponseWriter
  20. }
  21. func NewSetTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext, rw http.ResponseWriter) *SetTokenLogic {
  22. return &SetTokenLogic{
  23. Logger: logx.WithContext(ctx),
  24. ctx: ctx,
  25. svcCtx: svcCtx,
  26. rw: rw,
  27. }
  28. }
  29. func (l *SetTokenLogic) SetToken(username string) (resp *types.BaseMsgResp, err error) {
  30. claims, err := ParseJWT(username, l.svcCtx.Config.Auth.AccessSecret)
  31. if err != nil {
  32. return nil, error(err)
  33. }
  34. data, err := l.svcCtx.CoreRpc.GetUserById(context.TODO(), &core.UUIDReq{Id: claims.UserId})
  35. token, err := GetToken(strconv.FormatUint(*data.DepartmentId, 10))
  36. if err != nil {
  37. l.clearFastGPTCookie()
  38. return nil, fmt.Errorf("invalid token3")
  39. }
  40. //if err != nil {
  41. // return nil, err
  42. //}
  43. // 创建一个新的 Cookie
  44. cookie := &http.Cookie{
  45. Name: "fastgpt_token",
  46. Value: token, // 假设 req.Token 是你要设置的 Cookie 值
  47. Domain: ".gkscrm.com",
  48. SameSite: http.SameSiteNoneMode,
  49. Secure: true, // 如果 SameSite 设置为 None,必须设置 Secure 为 true
  50. HttpOnly: false,
  51. Path: "/",
  52. }
  53. // 设置 Cookie 到响应中
  54. http.SetCookie(l.rw, cookie)
  55. // 返回响应消息
  56. resp = &types.BaseMsgResp{
  57. Code: 0,
  58. Msg: "Cookie set successfully",
  59. }
  60. return
  61. }
  62. func (l *SetTokenLogic) clearFastGPTCookie() {
  63. cookie := &http.Cookie{
  64. Name: "fastgpt_token",
  65. Value: "",
  66. Domain: ".gkscrm.com",
  67. SameSite: http.SameSiteNoneMode,
  68. Secure: true,
  69. HttpOnly: false,
  70. Path: "/",
  71. MaxAge: -1, // 删除 Cookie
  72. }
  73. http.SetCookie(l.rw, cookie)
  74. l.Logger.Info("Cleared fastgpt_token cookie due to an error")
  75. }
  76. // SetTokenByUserId 根据用户ID设置token。
  77. // 参数:
  78. //
  79. // UserId - 用户的唯一标识符。
  80. //
  81. // 返回值:
  82. //
  83. // *types.BaseMsgResp - 响应消息,包含设置结果的代码和消息。
  84. // error - 如果操作失败,返回错误。
  85. func (l *SetTokenLogic) SetTokenByUserId(UserId string) (resp *types.BaseMsgResp, err error) {
  86. data, err := l.svcCtx.CoreRpc.GetUserById(context.TODO(), &core.UUIDReq{Id: UserId})
  87. println(data)
  88. token, err := GetToken(strconv.FormatUint(*data.DepartmentId, 10))
  89. if err != nil {
  90. return nil, fmt.Errorf("invalid token")
  91. }
  92. //if err != nil {
  93. // return nil, err
  94. //}
  95. // 创建一个新的 Cookie
  96. cookie := &http.Cookie{
  97. Name: "fastgpt_token",
  98. Value: token, // 假设 req.Token 是你要设置的 Cookie 值
  99. Domain: ".gkscrm.com",
  100. SameSite: http.SameSiteNoneMode,
  101. Secure: true, // 如果 SameSite 设置为 None,必须设置 Secure 为 true
  102. HttpOnly: false,
  103. Path: "/",
  104. }
  105. // 设置 Cookie 到响应中
  106. http.SetCookie(l.rw, cookie)
  107. // 返回响应消息
  108. resp = &types.BaseMsgResp{
  109. Code: 0,
  110. Msg: "Cookie set successfully",
  111. }
  112. return
  113. }
  114. func GetToken(username string) (string, error) {
  115. // 设置请求的 URL 和请求体
  116. url := "https://agent.gkscrm.com/api/support/user/account/loginByPassword"
  117. payload := map[string]string{
  118. "username": username,
  119. "password": "578fd6dfa3f71a8fadf5dc60d0e7115881db4c36504f83c4a0f4422107162c36",
  120. }
  121. // 将请求体编码为 JSON
  122. jsonPayload, err := json.Marshal(payload)
  123. if err != nil {
  124. return "", err
  125. }
  126. // 创建 HTTP 请求
  127. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
  128. if err != nil {
  129. return "", err
  130. }
  131. req.Header.Set("Content-Type", "application/json")
  132. // 发送请求
  133. client := &http.Client{}
  134. resp, err := client.Do(req)
  135. if err != nil {
  136. return "", err
  137. }
  138. defer resp.Body.Close()
  139. // 检查响应状态码
  140. if resp.StatusCode != http.StatusOK {
  141. return "", fmt.Errorf("failed to login, status code: %d", resp.StatusCode)
  142. }
  143. // 解析响应体
  144. var response map[string]interface{}
  145. err = json.NewDecoder(resp.Body).Decode(&response)
  146. if err != nil {
  147. return "", err
  148. }
  149. // 提取 token
  150. data, ok := response["data"].(map[string]interface{})
  151. if !ok {
  152. return "", fmt.Errorf("invalid response format")
  153. }
  154. token, ok := data["token"].(string)
  155. if !ok {
  156. return "", fmt.Errorf("token not found in response")
  157. }
  158. return token, nil
  159. }
  160. type Claims struct {
  161. RoleId string `json:"roleId"`
  162. UserId string `json:"userId"`
  163. jwt.RegisteredClaims
  164. }
  165. func ParseJWT(tokenString, accessSecret string) (*Claims, error) {
  166. claims := &Claims{}
  167. token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
  168. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  169. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  170. }
  171. return []byte(accessSecret), nil
  172. })
  173. if err != nil {
  174. return nil, fmt.Errorf("invalid token1")
  175. }
  176. if !token.Valid {
  177. return nil, fmt.Errorf("invalid token2")
  178. }
  179. return claims, nil
  180. }