|
@@ -2,12 +2,15 @@ package services
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "errors"
|
|
|
"eta/eta_api/models"
|
|
|
"eta/eta_api/models/company"
|
|
|
"eta/eta_api/models/system"
|
|
|
"eta/eta_api/utils"
|
|
|
"fmt"
|
|
|
"github.com/go-ldap/ldap"
|
|
|
+ "io"
|
|
|
+ "net/http"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"time"
|
|
@@ -239,3 +242,180 @@ func LdapUserCheck(userName, password string) (pass bool, err error) {
|
|
|
pass = true
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// ThirdLogin
|
|
|
+// @Description: 第三方登录(换取token)
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-01-30 16:09:18
|
|
|
+// @param req map[string]interface{}
|
|
|
+// @return data GetCrmTokenData
|
|
|
+// @return err error
|
|
|
+// @return errMsg string
|
|
|
+func ThirdLogin(req map[string]interface{}) (data GetCrmTokenData, err error, errMsg string) {
|
|
|
+ if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
|
|
|
+ authCode, ok := req["code"]
|
|
|
+ if !ok {
|
|
|
+ errMsg = "参数有误"
|
|
|
+ err = errors.New("参数缺失, code")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ authCodeStr := fmt.Sprint(authCode)
|
|
|
+ if authCodeStr == "" {
|
|
|
+ errMsg = "参数有误"
|
|
|
+ err = errors.New("参数缺失, AuthCode")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ data, err = CodeLoginFromMiddleServer(authCodeStr)
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ data, err, errMsg = ThirdCodeLoginFromMiddleServer(req)
|
|
|
+
|
|
|
+ // 普通的第三方
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// ThirdCodeLoginFromMiddleServer
|
|
|
+// @Description: 第三方登录(向桥接服务换取token)
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-01-30 16:09:35
|
|
|
+// @param param map[string]interface{}
|
|
|
+// @return tokenResp GetCrmTokenData
|
|
|
+// @return err error
|
|
|
+func ThirdCodeLoginFromMiddleServer(param map[string]interface{}) (tokenResp GetCrmTokenData, err error, errMsg string) {
|
|
|
+ if utils.EtaBridgeUrl == `` || utils.EtaBridgeLoginUrl == "" {
|
|
|
+ errMsg = `未配置第三方登录的桥接服务地址`
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ data, e := json.Marshal(param)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("data json marshal err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ body := io.NopCloser(strings.NewReader(string(data)))
|
|
|
+ client := &http.Client{}
|
|
|
+ req, e := http.NewRequest("POST", utils.EtaBridgeUrl+utils.EtaBridgeLoginUrl, body)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("http create request err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ contentType := "application/json;charset=utf-8"
|
|
|
+ req.Header.Set("Content-Type", contentType)
|
|
|
+
|
|
|
+ checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
|
|
|
+ req.Header.Set("Authorization", checkToken)
|
|
|
+ resp, e := client.Do(req)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("http client do err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ _ = resp.Body.Close()
|
|
|
+ }()
|
|
|
+ b, e := io.ReadAll(resp.Body)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("resp body read err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(b) == 0 {
|
|
|
+ err = fmt.Errorf("resp body is empty")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 生产环境解密, 注意有个坑前后的双引号
|
|
|
+ if utils.RunMode == "release" {
|
|
|
+ str := string(b)
|
|
|
+ str = strings.Trim(str, `"`)
|
|
|
+ b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
|
|
|
+ }
|
|
|
+
|
|
|
+ result := new(GetCrmTokenDataResp)
|
|
|
+ if e = json.Unmarshal(b, &result); e != nil {
|
|
|
+ err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
|
|
|
+ utils.FileLog.Info("第三方登录(向桥接服务换取token):\n" + string(b))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if result.Code != 200 {
|
|
|
+ errMsg = result.Msg
|
|
|
+ err = fmt.Errorf("result: %s", string(b))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tokenResp = result.Data
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// ThirdLogout
|
|
|
+// @Description: 第三方登出
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-01-30 16:09:18
|
|
|
+// @param req map[string]interface{}
|
|
|
+// @return data GetCrmTokenData
|
|
|
+// @return err error
|
|
|
+func ThirdLogout(accessToken string) (err error) {
|
|
|
+ if utils.EtaBridgeUrl == "" || utils.EtaBridgeLogoutUrl == "" {
|
|
|
+ // 未配置第三方登出的桥接服务地址
|
|
|
+ return
|
|
|
+ }
|
|
|
+ params := map[string]interface{}{
|
|
|
+ "access_token": accessToken,
|
|
|
+ }
|
|
|
+ data, e := json.Marshal(params)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("data json marshal err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ body := io.NopCloser(strings.NewReader(string(data)))
|
|
|
+ client := &http.Client{}
|
|
|
+ req, e := http.NewRequest("POST", utils.EtaBridgeUrl+utils.EtaBridgeLogoutUrl, body)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("http create request err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ contentType := "application/json;charset=utf-8"
|
|
|
+ req.Header.Set("Content-Type", contentType)
|
|
|
+ checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
|
|
|
+ req.Header.Set("Authorization", checkToken)
|
|
|
+ resp, e := client.Do(req)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("http client do err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ _ = resp.Body.Close()
|
|
|
+ }()
|
|
|
+ b, e := io.ReadAll(resp.Body)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("resp body read err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(b) == 0 {
|
|
|
+ err = fmt.Errorf("resp body is empty")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 生产环境解密, 注意有个坑前后的双引号
|
|
|
+ if utils.RunMode == "release" {
|
|
|
+ str := string(b)
|
|
|
+ str = strings.Trim(str, `"`)
|
|
|
+ b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
|
|
|
+ }
|
|
|
+
|
|
|
+ result := new(GetCrmTokenDataResp)
|
|
|
+ if e = json.Unmarshal(b, &result); e != nil {
|
|
|
+ err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if result.Code != 200 {
|
|
|
+ err = fmt.Errorf("result: %s", string(b))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|