|
@@ -0,0 +1,149 @@
|
|
|
+package fastgpt
|
|
|
+
|
|
|
+import (
|
|
|
+ "bytes"
|
|
|
+ "context"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "github.com/golang-jwt/jwt/v5"
|
|
|
+ "github.com/suyuan32/simple-admin-core/rpc/types/core"
|
|
|
+ "net/http"
|
|
|
+ "strconv"
|
|
|
+
|
|
|
+ "github.com/zeromicro/go-zero/core/logx"
|
|
|
+ "wechat-api/internal/svc"
|
|
|
+ "wechat-api/internal/types"
|
|
|
+)
|
|
|
+
|
|
|
+type SetTokenLogic struct {
|
|
|
+ logx.Logger
|
|
|
+ ctx context.Context
|
|
|
+ svcCtx *svc.ServiceContext
|
|
|
+ rw http.ResponseWriter
|
|
|
+}
|
|
|
+
|
|
|
+func NewSetTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext, rw http.ResponseWriter) *SetTokenLogic {
|
|
|
+ return &SetTokenLogic{
|
|
|
+ Logger: logx.WithContext(ctx),
|
|
|
+ ctx: ctx,
|
|
|
+ svcCtx: svcCtx,
|
|
|
+ rw: rw,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (l *SetTokenLogic) SetToken(username string) (resp *types.BaseMsgResp, err error) {
|
|
|
+ claims, err := ParseJWT(username, l.svcCtx.Config.Auth.AccessSecret)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("invalid token")
|
|
|
+ }
|
|
|
+ data, err := l.svcCtx.CoreRpc.GetUserById(context.TODO(), &core.UUIDReq{Id: claims.UserId})
|
|
|
+ token, err := l.getToken(strconv.FormatUint(*data.DepartmentId, 10))
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("invalid token")
|
|
|
+ }
|
|
|
+ //if err != nil {
|
|
|
+ // return nil, err
|
|
|
+ //}
|
|
|
+ // 创建一个新的 Cookie
|
|
|
+ cookie := &http.Cookie{
|
|
|
+ Name: "fastgpt_token",
|
|
|
+ Value: token, // 假设 req.Token 是你要设置的 Cookie 值
|
|
|
+ Domain: ".gkscrm.com",
|
|
|
+ SameSite: http.SameSiteNoneMode,
|
|
|
+ Secure: true, // 如果 SameSite 设置为 None,必须设置 Secure 为 true
|
|
|
+ HttpOnly: false,
|
|
|
+ Path: "/",
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置 Cookie 到响应中
|
|
|
+ http.SetCookie(l.rw, cookie)
|
|
|
+
|
|
|
+ // 返回响应消息
|
|
|
+ resp = &types.BaseMsgResp{
|
|
|
+ Code: 0,
|
|
|
+ Msg: "Cookie set successfully",
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (l *SetTokenLogic) getToken(username string) (string, error) {
|
|
|
+ // 设置请求的 URL 和请求体
|
|
|
+ url := "https://agent.gkscrm.com/api/support/user/account/loginByPassword"
|
|
|
+ payload := map[string]string{
|
|
|
+ "username": username,
|
|
|
+ "password": "578fd6dfa3f71a8fadf5dc60d0e7115881db4c36504f83c4a0f4422107162c36",
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将请求体编码为 JSON
|
|
|
+ jsonPayload, err := json.Marshal(payload)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建 HTTP 请求
|
|
|
+ req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ req.Header.Set("Content-Type", "application/json")
|
|
|
+
|
|
|
+ // 发送请求
|
|
|
+ client := &http.Client{}
|
|
|
+ resp, err := client.Do(req)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+
|
|
|
+ // 检查响应状态码
|
|
|
+ if resp.StatusCode != http.StatusOK {
|
|
|
+ return "", fmt.Errorf("failed to login, status code: %d", resp.StatusCode)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析响应体
|
|
|
+ var response map[string]interface{}
|
|
|
+ err = json.NewDecoder(resp.Body).Decode(&response)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取 token
|
|
|
+ data, ok := response["data"].(map[string]interface{})
|
|
|
+ if !ok {
|
|
|
+ return "", fmt.Errorf("invalid response format")
|
|
|
+ }
|
|
|
+ token, ok := data["token"].(string)
|
|
|
+ if !ok {
|
|
|
+ return "", fmt.Errorf("token not found in response")
|
|
|
+ }
|
|
|
+
|
|
|
+ return token, nil
|
|
|
+}
|
|
|
+
|
|
|
+type Claims struct {
|
|
|
+ RoleId string `json:"roleId"`
|
|
|
+ UserId string `json:"userId"`
|
|
|
+ jwt.RegisteredClaims
|
|
|
+}
|
|
|
+
|
|
|
+func ParseJWT(tokenString, accessSecret string) (*Claims, error) {
|
|
|
+ claims := &Claims{}
|
|
|
+
|
|
|
+ token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
|
|
|
+ if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
|
|
|
+ return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
|
|
+ }
|
|
|
+ return []byte(accessSecret), nil
|
|
|
+ })
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("invalid token")
|
|
|
+ }
|
|
|
+
|
|
|
+ if !token.Valid {
|
|
|
+ return nil, fmt.Errorf("invalid token")
|
|
|
+ }
|
|
|
+
|
|
|
+ return claims, nil
|
|
|
+}
|