Explorar el Código

test: 用户信息

hsun hace 6 meses
padre
commit
c1f51e58c3
Se han modificado 8 ficheros con 450 adiciones y 4 borrados
  1. 9 4
      config/config.go
  2. 39 0
      controller/gn/auth.go
  3. 1 0
      init_serve/router.go
  4. 65 0
      logic/gn/auth.go
  5. 6 0
      models/request/gn/auth.go
  6. 8 0
      models/response/auth.go
  7. 51 0
      routers/gn.go
  8. 271 0
      services/gn/auth.go

+ 9 - 4
config/config.go

@@ -123,8 +123,13 @@ type PCSG struct {
 
 // Gn 国能的的配置
 type Gn struct {
-	IndexSyncMinute  int    `mapstructure:"index-sync-minute" json:"index-sync-minute" yaml:"index-sync-minute" description:"国能同步N分钟前至现在的指标(负数)"`
-	DataHost         string `mapstructure:"data-host" json:"data-host" yaml:"data-host" description:"数据节点地址"`
-	DataAccessKey    string `mapstructure:"data-access-key" json:"data-access-key" yaml:"data-access-key" description:"数据节点的access_key"`
-	DataAccessSecret string `mapstructure:"data-access-secret" json:"data-access-secret" yaml:"data-access-secret" description:"数据节点的access_secret"`
+	IndexSyncMinute    int    `mapstructure:"index-sync-minute" json:"index-sync-minute" yaml:"index-sync-minute" description:"国能同步N分钟前至现在的指标(负数)"`
+	DataHost           string `mapstructure:"data-host" json:"data-host" yaml:"data-host" description:"数据节点地址"`
+	DataAccessKey      string `mapstructure:"data-access-key" json:"data-access-key" yaml:"data-access-key" description:"数据节点的access_key"`
+	DataAccessSecret   string `mapstructure:"data-access-secret" json:"data-access-secret" yaml:"data-access-secret" description:"数据节点的access_secret"`
+	AuthClientId       string `mapstructure:"auth-client-id" json:"auth-client-id" yaml:"auth-client-id" description:"统一认证-ClientID"`
+	AuthClientSecret   string `mapstructure:"auth-client-secret" json:"auth-client-secret" yaml:"auth-client-secret" description:"统一认证-密钥"`
+	AuthSSOCallbackUrl string `mapstructure:"auth-sso-callback-url" json:"auth-sso-callback-url" yaml:"auth-sso-callback-url" description:"统一认证-回调地址"`
+	AuthTokenApiUrl    string `mapstructure:"auth-token-api-url" json:"auth-token-api-url" yaml:"auth-token-api-url" description:"统一认证-获取Token地址"`
+	AuthUserApiUrl     string `mapstructure:"auth-user-api-url" json:"auth-user-api-url" yaml:"auth-user-api-url" description:"统一认证-获取UserInfo地址"`
 }

+ 39 - 0
controller/gn/auth.go

@@ -0,0 +1,39 @@
+package gn
+
+import (
+	"eta_gn/eta_bridge/controller/resp"
+	"eta_gn/eta_bridge/global"
+	"eta_gn/eta_bridge/logic/gn"
+	gnRequest "eta_gn/eta_bridge/models/request/gn"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+)
+
+// GuoNengController 国能
+type GuoNengController struct{}
+
+func (gc *GuoNengController) GetToken(c *gin.Context) {
+	var req gnRequest.GetTokenReq
+	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.Code == "" {
+		resp.FailMsg("请传入code码", "请输入指标code码", c)
+		return
+	}
+
+	result, err, errMsg := gn.LoginEta(req.Code)
+	if err != nil {
+		fmt.Printf("获取失败, Err: %v, ErrMsg: %s", err, errMsg)
+		resp.FailData(errMsg, err.Error(), c)
+		return
+	}
+	resp.OkData("获取成功", result, c)
+}

+ 1 - 0
init_serve/router.go

@@ -22,5 +22,6 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitIndexData(rBase)
 	routers.InitXiangyu(rBase)
 	routers.InitPCSG(rBase)
+	routers.InitGn(rBase)
 	return
 }

+ 65 - 0
logic/gn/auth.go

@@ -0,0 +1,65 @@
+package gn
+
+import (
+	"eta_gn/eta_bridge/models/response"
+	"eta_gn/eta_bridge/services/gn"
+)
+
+// LoginEta
+// @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 LoginEta(code string) (resp response.GnUserResp, err error, errMsg string) {
+	tokenResp, err := gn.GetToken(code)
+	if err != nil {
+		return
+	}
+
+	//// 获取eta用户信息
+	//adminInfo, err := eta.GetSysUserByOutId(tokenResp.Uid)
+	//if err != nil {
+	//	return
+	//}
+
+	// 获取用户信息
+	res, err := gn.GetUserInfo(code, tokenResp.AccessToken)
+	if err != nil {
+		return
+	}
+	resp.Sub = res.Sub
+	resp.PreferredUsername = res.PreferredUsername
+	resp.Name = res.Name
+	resp.FamilyName = res.FamilyName
+	resp.GivenName = res.GivenName
+
+	//// 获取eta用户信息
+	//adminInfo, err := eta.GetSysUserByAdminName(userInfoResp.LoginName)
+	//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: tokenResp.AccessToken,
+	//	//ThirdRefreshToken: tokenResp.RefreshToken,
+	//	ThirdExpiredTime: time.Now().Add(time.Duration(tokenResp.ExpiresIn-100) * time.Second),
+	//	CreatedTime:      time.Now(),
+	//	LastUpdatedTime:  time.Now(),
+	//}
+	//err = eta.AddSysThirdSession(thirdSession)
+	return
+}

+ 6 - 0
models/request/gn/auth.go

@@ -0,0 +1,6 @@
+package gn
+
+// GetTokenReq 获取token请求体
+type GetTokenReq struct {
+	Code string `json:"code" form:"code" description:"code编码"`
+}

+ 8 - 0
models/response/auth.go

@@ -11,3 +11,11 @@ type LoginResp struct {
 	ProductName     string `description:"产品名称:admin,ficc,权益"`
 	Authority       int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
 }
+
+type GnUserResp struct {
+	Sub               string
+	Name              string
+	PreferredUsername string
+	GivenName         string
+	FamilyName        string
+}

+ 51 - 0
routers/gn.go

@@ -0,0 +1,51 @@
+package routers
+
+import (
+	"eta_gn/eta_bridge/controller/gn"
+	"github.com/gin-gonic/gin"
+)
+
+// InitGn 国能路由
+func InitGn(r *gin.RouterGroup) {
+	control := new(gn.GuoNengController)
+	group := r.Group("gn/")
+	group.GET("auth/getToken", control.GetToken)
+	//group.GET("user/pull", control.PullUser)
+
+	// 需要内部鉴权的接口
+	//initAuthXiangyu(r)
+
+	// 指标接口
+	//initIndexXiangyu(r)
+
+	// crm数据接口
+	//initCrmXiangyu(r)
+}
+
+//func initAuthXiangyu(r *gin.RouterGroup) {
+//	control := new(xiangyu.XiangyuController)
+//	group := r.Group("xy/").Use(middleware.InternalToken())
+//	group.POST("auth/getToken", control.GetToken)
+//	group.GET("auth/refreshToken", control.RefreshToken)
+//	group.POST("auth/revokeToken", control.RevokeToken)
+//}
+
+//func initIndexXiangyu(r *gin.RouterGroup) {
+//	control := new(xiangyu.XiangyuController)
+//	group := r.Group("xy/").Use(middleware.InternalToken())
+//	group.POST("index/pushIndexData", control.PushIndexDataResp)
+//	group.POST("index/pushIndexValue", control.PushIndexValueDataResp)
+//	group.POST("index/pushClassify", control.PushClassifyDataResp)
+//	group.POST("index/pushEdbClassify", control.PushEdbClassifyDataResp)
+//}
+
+// initCrmXiangyu
+// @Description: Crm数据接口
+// @author: Roc
+// @datetime 2024-05-14 17:21:22
+// @param r *gin.RouterGroup
+//func initCrmXiangyu(r *gin.RouterGroup) {
+//	control := new(xiangyu.XiangyuController)
+//	group := r.Group("xy/index/").Use(middleware.InternalToken())
+//	group.GET("crm/getCrmData", control.GetCrmData)
+//}

+ 271 - 0
services/gn/auth.go

@@ -0,0 +1,271 @@
+package gn
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"eta_gn/eta_bridge/global"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+type AccessTokenResp struct {
+	ErrResp          `description:"报错响应"`
+	AccessToken      string `json:"access_token"`
+	ExpiresIn        int    `json:"expires_in"`
+	RefreshExpiresIn int    `json:"refresh_expires_in"`
+	RefreshToken     string `json:"refresh_token"`
+	TokenType        string `json:"token_type"`
+	NotBeforePolicy  int    `json:"not-before-policy"`
+	SessionState     string `json:"session_state"`
+	//Error            string `json:"error" description:"错误代码"`
+	//ErrorDescription string `json:"error_description" description:"错误描述"`
+}
+
+type UserBaseInfoResp struct {
+	ErrResp           `description:"报错响应"`
+	Sub               string `json:"sub"`
+	Name              string `json:"name"`
+	PreferredUsername string `json:"preferred_username"`
+	GivenName         string `json:"given_name"`
+	FamilyName        string `json:"family_name"`
+}
+
+// ErrResp
+// @Description: 错误信息返回
+type ErrResp struct {
+	Error            string `json:"error" description:"错误代码"`
+	ErrorDescription string `json:"error_description" description:"错误描述"`
+}
+
+// GetToken
+// @Description: 获取token信息
+// @author: Roc
+// @datetime 2024-01-23 15:40:56
+// @param code string
+// @return resp *AccessTokenResp
+// @return err error
+func GetToken(code string) (resp *AccessTokenResp, err error) {
+	code = strings.TrimSpace(code)
+	if code == "" {
+		err = fmt.Errorf("code不可为空")
+		return
+	}
+	//baseUrl := `%s?client_id=%s&client_secret=%s&redirect_uri=%s&code=%s&grant_type=authorization_code`
+
+	baseUrl := global.CONFIG.Gn.AuthTokenApiUrl
+	params := url.Values{}
+	params.Add("client_id", global.CONFIG.Gn.AuthClientId)
+	params.Add("client_secret", global.CONFIG.Gn.AuthClientSecret)
+	params.Add("redirect_uri", global.CONFIG.Gn.AuthSSOCallbackUrl)
+	params.Add("code", code)
+	params.Add("grant_type", "authorization_code")
+
+	//callbackUrl := url.QueryEscape(global.CONFIG.Gn.AuthSSOCallbackUrl)
+	//fmt.Println("CallbackUrl: ", callbackUrl)
+	//urlPath := fmt.Sprintf(baseUrl, global.CONFIG.Gn.AuthTokenApiUrl, global.CONFIG.Gn.AuthClientId, global.CONFIG.Gn.AuthClientSecret, callbackUrl, code)
+	//fmt.Println("RequestUrl: ", urlPath)
+
+	result, e := HttpPostAuth(baseUrl, params, "")
+	//urlPath := fmt.Sprintf(`/idp/oauth2/getToken?client_id=%s&grant_type=authorization_code&code=%s&client_secret=%s`, global.CONFIG.Xiangyu.SystemCode, code, global.CONFIG.Xiangyu.UserKey)
+	//result, e := HttpPostAuth(urlPath, ``, "")
+	if e != nil {
+		err = fmt.Errorf("统一认证请求失败, %v", e)
+		return
+	}
+	fmt.Printf("Token RequestResult: %s\n", string(result))
+
+	//  解析响应结果
+	if e := json.Unmarshal(result, &resp); e != nil {
+		err = fmt.Errorf("解析响应失败, %v", e)
+		return
+	}
+
+	if resp.Error != "" {
+		err = fmt.Errorf("Token请求失败, Err: %s, ErrMsg: %s ", resp.Error, resp.ErrorDescription)
+		//err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.ErrCode, resp.Msg))
+		return
+	}
+	return
+}
+
+// GetUserInfo
+// @Description: 获取用户信息
+// @author: Roc
+// @datetime 2024-01-23 15:49:38
+// @param token string
+// @return resp *UserBaseInfoResp
+// @return err error
+func GetUserInfo(code, token string) (resp *UserBaseInfoResp, err error) {
+	code = strings.TrimSpace(code)
+	token = strings.TrimSpace(token)
+	if code == "" || token == "" {
+		err = fmt.Errorf("Code和Token不可为空, Code: %s, Token: %s", code, token)
+		return
+	}
+
+	baseUrl := global.CONFIG.Gn.AuthUserApiUrl
+	params := url.Values{}
+	params.Add("code", code)
+	params.Add("access_token", token)
+
+	//callbackUrl := url.QueryEscape(global.CONFIG.Gn.AuthSSOCallbackUrl)
+	//fmt.Println("CallbackUrl: ", callbackUrl)
+	//urlPath := fmt.Sprintf(baseUrl, global.CONFIG.Gn.AuthTokenApiUrl, global.CONFIG.Gn.AuthClientId, global.CONFIG.Gn.AuthClientSecret, callbackUrl, code)
+	//fmt.Println("RequestUrl: ", urlPath)
+
+	result, err := HttpPostAuth(baseUrl, params, "")
+	//urlPath := fmt.Sprintf(`/idp/oauth2/getUserInfo?client_id=%s&access_token=%s`, global.CONFIG.Xiangyu.SystemCode, token)
+
+	//result, err := HttpGetAuth(urlPath)
+	if err != nil {
+		return
+	}
+	fmt.Printf("UserInfoResult: %s\n", string(result))
+
+	//  解析响应结果
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+	if resp.Error != "" {
+		err = fmt.Errorf("UserInfo请求失败, Err: %s, ErrMsg: %s ", resp.Error, resp.ErrorDescription)
+		return
+	}
+	return
+}
+
+// HttpPostAuth
+// @Description: post请求
+// @author: Roc
+// @datetime 2024-01-23 16:20:10
+// @param urlPath string
+// @param postData string
+// @param params ...string
+// @return []byte
+// @return error
+//func HttpPostAuth(urlPath, postData string, params ...string) ([]byte, error) {
+//	//if global.CONFIG.Xiangyu.UserAuthHost == `` {
+//	//	return nil, errors.New("统一用户同步接口地址为空")
+//	//}
+//	// 请求地址
+//	//postUrl := global.CONFIG.Xiangyu.UserAuthHost + urlPath
+//	postUrl := urlPath
+//
+//	body := io.NopCloser(strings.NewReader(postData))
+//	client := &http.Client{}
+//	req, err := http.NewRequest("POST", postUrl, body)
+//	if err != nil {
+//		return nil, err
+//	}
+//	contentType := "application/x-www-form-urlencoded;charset=utf-8"
+//	if len(params) > 0 && params[0] != "" {
+//		contentType = params[0]
+//	}
+//	req.Header.Set("content-Type", contentType)
+//	resp, err := client.Do(req)
+//	if err != nil {
+//		return nil, err
+//	}
+//	defer resp.Body.Close()
+//	result, err := io.ReadAll(resp.Body)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	// 日志记录
+//	global.FILE_LOG.Debug("统一认证:地址:" + postUrl + ";\n请求参数:" + postData + ";\n返回参数:" + string(result))
+//
+//	//  解析返回参数,判断是否是json
+//	if !json.Valid(result) {
+//		err = errors.New("返回参数不是json格式")
+//	}
+//
+//	return result, err
+//}
+
+// HttpGetAuth
+// @Description: get请求
+// @author: Roc
+// @datetime 2024-01-23 16:20:16
+// @param urlPath string
+// @return []byte
+// @return error
+func HttpGetAuth(urlPath string) ([]byte, error) {
+	if global.CONFIG.Xiangyu.UserAuthHost == `` {
+		return nil, errors.New("统一用户同步接口地址为空")
+	}
+	// 请求地址
+	getUrl := global.CONFIG.Xiangyu.UserAuthHost + urlPath
+	client := &http.Client{}
+	req, err := http.NewRequest("GET", getUrl, nil)
+	if err != nil {
+		return nil, err
+	}
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	result, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	// 日志记录
+	global.FILE_LOG.Debug("统一认证:地址:" + getUrl + ";\n返回参数:" + string(result))
+
+	//  解析返回参数,判断是否是json
+	if !json.Valid(result) {
+		err = errors.New("返回参数不是json格式")
+	}
+	return result, err
+}
+
+func HttpPostAuth(postUrl string, params url.Values, contentTypes ...string) ([]byte, error) {
+	//if global.CONFIG.Xiangyu.UserAuthHost == `` {
+	//	return nil, errors.New("统一用户同步接口地址为空")
+	//}
+	// 请求地址
+	//postUrl := global.CONFIG.Xiangyu.UserAuthHost + urlPath
+	//postUrl := urlPath
+
+	//body := io.NopCloser(strings.NewReader(postData))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", postUrl, bytes.NewBufferString(params.Encode()))
+	//req, err := http.NewRequest("POST", postUrl, body)
+	if err != nil {
+		return nil, err
+	}
+	contentType := "application/x-www-form-urlencoded;charset=utf-8"
+	if len(contentTypes) > 0 && contentTypes[0] != "" {
+		contentType = contentTypes[0]
+	}
+	req.Header.Set("content-Type", contentType)
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	result, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	// 日志记录
+	postData := fmt.Sprintf("%v", params)
+	global.FILE_LOG.Debug("统一认证:地址:" + postUrl + ";\n请求参数:" + postData + ";\n返回参数:" + string(result))
+
+	//  解析返回参数,判断是否是json
+	if !json.Valid(result) {
+		err = errors.New("返回参数不是json格式")
+	}
+	return result, err
+}