浏览代码

fix:新增oa认证

Roc 7 小时之前
父节点
当前提交
2e656e344a
共有 6 个文件被更改,包括 206 次插入16 次删除
  1. 47 0
      controller/xiangyu/oa.go
  2. 60 0
      logic/xiangyu/oa.go
  3. 7 0
      models/request/xiangyu/oa.go
  4. 1 0
      routers/xiangyu.go
  5. 66 0
      services/xiangyu/oa.go
  6. 25 16
      services/xiangyu/user.go

+ 47 - 0
controller/xiangyu/oa.go

@@ -0,0 +1,47 @@
+package xiangyu
+
+import (
+	"eta/eta_bridge/controller/resp"
+	"eta/eta_bridge/global"
+	"eta/eta_bridge/logic/xiangyu"
+	xyReq "eta/eta_bridge/models/request/xiangyu"
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+)
+
+// CheckSidPS
+// @Description: 校验提供的sid和token是否合法,是否用户已登录OA
+// @author: Roc
+// @receiver xc
+// @datetime 2024-01-23 17:06:34
+// @param c *gin.Context
+func (xc *XiangyuController) CheckSidPS(c *gin.Context) {
+	var req xyReq.CheckSidPSReq
+	if e := c.Bind(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+	if req.Sid == "" {
+		resp.FailMsg("请传入sid账号", "请传入sid账号", c)
+		return
+	}
+	if req.Token == "" {
+		resp.FailMsg("请传入token令牌", "请传入token令牌", c)
+		return
+	}
+
+	result, err, errMsg := xiangyu.LoginEtaByToken(req.Sid, req.Token)
+
+	if err != nil {
+		resp.FailData(errMsg, err.Error(), c)
+		return
+	}
+	resp.OkData("获取成功", result, c)
+
+	return
+}

+ 60 - 0
logic/xiangyu/oa.go

@@ -0,0 +1,60 @@
+package xiangyu
+
+import (
+	"errors"
+	"eta/eta_bridge/models/eta"
+	"eta/eta_bridge/models/response"
+	"eta/eta_bridge/services"
+	"eta/eta_bridge/services/xiangyu"
+	"time"
+)
+
+// LoginEtaByToken
+// @Description: 获取eta的session
+// @author: Roc
+// @datetime 2024-01-23 17:44:15
+// @param code string
+// @return resp response.LoginResp
+// @return err error
+// @return errMsg string
+func LoginEtaByToken(sid, token string) (resp response.LoginResp, err error, errMsg string) {
+	//  获取xiangyu token
+	isLogin, err := xiangyu.CheckSidPS(sid, token)
+	if err != nil {
+		return
+	}
+
+	if !isLogin {
+		errMsg = `OA平台未登录,请重新登录`
+		err = errors.New(errMsg)
+		return
+	}
+
+	// 获取eta用户信息
+	adminInfo, err := eta.GetSysUserByAdminName(sid)
+	if err != nil {
+		return
+	}
+
+	// 生成登录session
+	resp, session, err, errMsg := services.CreateEtaSession(adminInfo)
+	if err != nil {
+		return
+	}
+
+	// 记录两方session的绑定信息
+	thirdSession := &eta.SysThirdSession{
+		ID:               0,
+		SysUserID:        uint64(session.SysUserId),
+		UserName:         session.UserName,
+		AccessToken:      session.AccessToken,
+		ThirdAccessToken: token,
+		//ThirdRefreshToken: tokenResp.RefreshToken,
+		//ThirdExpiredTime: time.Now().Add(time.Duration(tokenResp.ExpiresIn-100) * time.Second),
+		CreatedTime:     time.Now(),
+		LastUpdatedTime: time.Now(),
+	}
+	eta.AddSysThirdSession(thirdSession)
+
+	return
+}

+ 7 - 0
models/request/xiangyu/oa.go

@@ -0,0 +1,7 @@
+package xiangyu
+
+// CheckSidPSReq 获取校验token请求体
+type CheckSidPSReq struct {
+	Sid   string `json:"sid" form:"sid" description:"域账号:从url获取"`
+	Token string `json:"token" form:"token" description:"令牌:从url获取"`
+}

+ 1 - 0
routers/xiangyu.go

@@ -29,6 +29,7 @@ func initAuthXiangyu(r *gin.RouterGroup) {
 	group.POST("auth/getToken", control.GetToken)
 	group.POST("auth/getToken", control.GetToken)
 	group.GET("auth/refreshToken", control.RefreshToken)
 	group.GET("auth/refreshToken", control.RefreshToken)
 	group.POST("auth/revokeToken", control.RevokeToken)
 	group.POST("auth/revokeToken", control.RevokeToken)
+	group.POST("oa/checkSidPS", control.CheckSidPS)
 }
 }
 
 
 func initIndexXiangyu(r *gin.RouterGroup) {
 func initIndexXiangyu(r *gin.RouterGroup) {

+ 66 - 0
services/xiangyu/oa.go

@@ -0,0 +1,66 @@
+package xiangyu
+
+import (
+	"encoding/json"
+	"eta/eta_bridge/global"
+	"fmt"
+)
+
+// CheckSidPsReq
+// @Description: 校验提供的sid和token是否合法,是否用户已登录OA请求参
+type CheckSidPsReq struct {
+	In0   In0    `json:"in0"`
+	Sid   string `json:"sid" description:"域账号:从url获取"`
+	Token string `json:"token" description:"令牌:从url获取 是"`
+}
+
+// CheckSidPS
+// @Description: 校验提供的sid和token是否合法,是否用户已登录OA
+// @author: Roc
+// @datetime 2025-07-04 13:59:59
+// @param sid string
+// @param token string
+// @return isLogin bool
+// @return err error
+func CheckSidPS(sid, token string) (isLogin bool, err error) {
+	urlPath := `/OA/login/ProxyServices/checkSidPS`
+	req := CheckSidPsReq{
+		In0: In0{
+			PageTotal: "",
+			PageNo:    "",
+			DocType:   "login",
+			Property:  "",
+			//DocCode:   getDocCode(),
+			Source: global.CONFIG.Xiangyu.SystemCode,
+			Target: global.CONFIG.Xiangyu.UserSyncTarget,
+		},
+		Sid:   sid,
+		Token: token,
+	}
+
+	postData, err := json.Marshal(req)
+	if err != nil {
+		return
+	}
+
+	result, err := HttpPost(urlPath, string(postData), map[string]string{"content-Type": "application/json", "Accept-Encoding": "identity"})
+	if err != nil {
+		return
+	}
+
+	//  解析响应结果
+	var resp *BaseResponse
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+
+	if resp.ReturnCode != "S" {
+		err = fmt.Errorf("响应代码:%s,错误信息:%s", resp.ReturnCode, resp.ReturnMsg)
+		return
+	}
+
+	isLogin = true
+
+	return
+}

+ 25 - 16
services/xiangyu/user.go

@@ -79,7 +79,7 @@ func Login() (tokenId string, err error) {
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
+	result, err := HttpPost(urlPath, string(postData), map[string]string{"content-Type": "application/json"})
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
@@ -140,7 +140,7 @@ func Logout(tokenId string) (err error) {
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
+	result, err := HttpPost(urlPath, string(postData), map[string]string{"content-Type": "application/json"})
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
@@ -262,7 +262,7 @@ type UserData struct {
 // @author: Roc
 // @author: Roc
 // @datetime 2024-01-18 13:30:38
 // @datetime 2024-01-18 13:30:38
 // @param tokenId string
 // @param tokenId string
-// @return resp *BaseResponse
+// @return resp *SyncTaskUserResp
 // @return err error
 // @return err error
 func SyncTask(tokenId string) (userResp *SyncTaskUserResp, err error) {
 func SyncTask(tokenId string) (userResp *SyncTaskUserResp, err error) {
 	urlPath := `/IAM/XYGIntegrationService/syncTask/ProxyServices/syncTaskPS`
 	urlPath := `/IAM/XYGIntegrationService/syncTask/ProxyServices/syncTaskPS`
@@ -284,7 +284,7 @@ func SyncTask(tokenId string) (userResp *SyncTaskUserResp, err error) {
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
+	result, err := HttpPost(urlPath, string(postData), map[string]string{"content-Type": "application/json"})
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
@@ -334,7 +334,12 @@ type SyncFinishReq struct {
 // @author: Roc
 // @author: Roc
 // @datetime 2024-01-18 13:30:38
 // @datetime 2024-01-18 13:30:38
 // @param tokenId string
 // @param tokenId string
-// @return resp *BaseResponse
+// @param objectCode string
+// @param objectType string
+// @param id string
+// @param guid string
+// @param message string
+// @param success bool
 // @return err error
 // @return err error
 func SyncFinish(tokenId, objectCode, objectType, id, guid, message string, success bool) (err error) {
 func SyncFinish(tokenId, objectCode, objectType, id, guid, message string, success bool) (err error) {
 	urlPath := `/IAM/XYGIntegrationService/syncFinish/ProxyServices/syncFinishPS`
 	urlPath := `/IAM/XYGIntegrationService/syncFinish/ProxyServices/syncFinishPS`
@@ -364,7 +369,7 @@ func SyncFinish(tokenId, objectCode, objectType, id, guid, message string, succe
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
+	result, err := HttpPost(urlPath, string(postData), map[string]string{"content-Type": "application/json"})
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
@@ -409,7 +414,7 @@ type PullTaskUserResp struct {
 // @author: Roc
 // @author: Roc
 // @datetime 2024-01-16 14:04:47
 // @datetime 2024-01-16 14:04:47
 // @param tokenId string
 // @param tokenId string
-// @return resp *BaseResponse
+// @return userResp *PullTaskUserResp
 // @return err error
 // @return err error
 func PullTask(tokenId string) (userResp *PullTaskUserResp, err error) {
 func PullTask(tokenId string) (userResp *PullTaskUserResp, err error) {
 	urlPath := `/IAM/XYGIntegrationService/pullTask/ProxyServices/pullTaskPS`
 	urlPath := `/IAM/XYGIntegrationService/pullTask/ProxyServices/pullTaskPS`
@@ -431,7 +436,7 @@ func PullTask(tokenId string) (userResp *PullTaskUserResp, err error) {
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
+	result, err := HttpPost(urlPath, string(postData), map[string]string{"content-Type": "application/json"})
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
@@ -479,9 +484,8 @@ type PullFinishReq struct {
 // @param tokenId string
 // @param tokenId string
 // @param taskId string
 // @param taskId string
 // @param guid string
 // @param guid string
-// @param success bool
 // @param message string
 // @param message string
-// @return resp *BaseResponse
+// @param success bool
 // @return err error
 // @return err error
 func PullFinish(tokenId, taskId, guid, message string, success bool) (err error) {
 func PullFinish(tokenId, taskId, guid, message string, success bool) (err error) {
 	urlPath := `/IAM/XYGIntegrationService/pullFinish/ProxyServices/pullFinishPS`
 	urlPath := `/IAM/XYGIntegrationService/pullFinish/ProxyServices/pullFinishPS`
@@ -507,7 +511,7 @@ func PullFinish(tokenId, taskId, guid, message string, success bool) (err error)
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
+	result, err := HttpPost(urlPath, string(postData), map[string]string{"content-Type": "application/json"})
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
@@ -536,7 +540,7 @@ func getDocCode() string {
 	return fmt.Sprintf("%s-%s", time.Now().Format(utils.FormatDateTimeUnSpace), utils.GetRandStringNoSpecialChar(32))
 	return fmt.Sprintf("%s-%s", time.Now().Format(utils.FormatDateTimeUnSpace), utils.GetRandStringNoSpecialChar(32))
 }
 }
 
 
-func HttpPost(urlPath, postData string, params ...string) ([]byte, error) {
+func HttpPost(urlPath, postData string, headerMap map[string]string) ([]byte, error) {
 	if global.CONFIG.Xiangyu.UserSyncHost == `` {
 	if global.CONFIG.Xiangyu.UserSyncHost == `` {
 		return nil, errors.New("统一用户同步接口地址为空")
 		return nil, errors.New("统一用户同步接口地址为空")
 	}
 	}
@@ -550,11 +554,16 @@ func HttpPost(urlPath, postData string, params ...string) ([]byte, error) {
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-	contentType := "application/x-www-form-urlencoded;charset=utf-8"
-	if len(params) > 0 && params[0] != "" {
-		contentType = params[0]
+
+	for headerKey, headerVal := range headerMap {
+		req.Header.Set(headerKey, headerVal)
+	}
+
+	// 如果没有标记content-Type,那么就默认添加一个
+	if _, ok := headerMap["content-Type"]; !ok {
+		contentType := "application/x-www-form-urlencoded;charset=utf-8"
+		req.Header.Set("content-Type", contentType)
 	}
 	}
-	req.Header.Set("content-Type", contentType)
 	req.SetBasicAuth(global.CONFIG.Xiangyu.UserSyncAuthUserName, global.CONFIG.Xiangyu.UserSyncAuthPwd)
 	req.SetBasicAuth(global.CONFIG.Xiangyu.UserSyncAuthUserName, global.CONFIG.Xiangyu.UserSyncAuthPwd)
 	resp, err := client.Do(req)
 	resp, err := client.Do(req)
 	if err != nil {
 	if err != nil {