|
@@ -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"`
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+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"`
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+type ErrResp struct {
|
|
|
+ Error string `json:"error" description:"错误代码"`
|
|
|
+ ErrorDescription string `json:"error_description" description:"错误描述"`
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func GetToken(code string) (resp *AccessTokenResp, err error) {
|
|
|
+ code = strings.TrimSpace(code)
|
|
|
+ if code == "" {
|
|
|
+ err = fmt.Errorf("code不可为空")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ 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")
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ result, e := HttpPostAuth(baseUrl, params, "")
|
|
|
+
|
|
|
+
|
|
|
+ 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)
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+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)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ result, err := HttpPostAuth(baseUrl, params, "")
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 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
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+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))
|
|
|
+
|
|
|
+
|
|
|
+ if !json.Valid(result) {
|
|
|
+ err = errors.New("返回参数不是json格式")
|
|
|
+ }
|
|
|
+ return result, err
|
|
|
+}
|
|
|
+
|
|
|
+func HttpPostAuth(postUrl string, params url.Values, contentTypes ...string) ([]byte, error) {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ client := &http.Client{}
|
|
|
+ req, err := http.NewRequest("POST", postUrl, bytes.NewBufferString(params.Encode()))
|
|
|
+
|
|
|
+ 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))
|
|
|
+
|
|
|
+
|
|
|
+ if !json.Valid(result) {
|
|
|
+ err = errors.New("返回参数不是json格式")
|
|
|
+ }
|
|
|
+ return result, err
|
|
|
+}
|