oss_service.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package oauth
  2. import (
  3. "context"
  4. "dashoo.cn/common_definition/auth"
  5. "dashoo.cn/micro_libary/db"
  6. "dashoo.cn/micro_libary/micro_srv"
  7. dautils "dashoo.cn/micro_libary/utils"
  8. "dashoo.cn/sso_libary/utils"
  9. "encoding/json"
  10. "errors"
  11. "fmt"
  12. "github.com/gogf/gf/crypto/gmd5"
  13. "github.com/gogf/gf/encoding/gbase64"
  14. "github.com/gogf/gf/encoding/gjson"
  15. "github.com/gogf/gf/frame/g"
  16. "github.com/gogf/gf/os/glog"
  17. "github.com/gogf/gf/os/gtime"
  18. "github.com/gogf/gf/util/gconv"
  19. "github.com/gogf/gf/util/grand"
  20. "github.com/mssola/user_agent"
  21. "github.com/smallnest/rpcx/client"
  22. "github.com/smallnest/rpcx/share"
  23. )
  24. var OssService *OssServiceImpl
  25. var authService client.XClient
  26. type UserService struct {
  27. db.ServiceBase
  28. }
  29. func NewService(tenant string) (UserService, error) {
  30. var service UserService
  31. err := service.Init(tenant, "base_user")
  32. return service, err
  33. }
  34. func init() {
  35. OssService = NewOssService()
  36. authService = micro_srv.InitMicroSrvClient("Auth", "micro_srv.auth")
  37. }
  38. type OssServiceImpl struct {
  39. }
  40. func NewOssService() *OssServiceImpl {
  41. return &OssServiceImpl{}
  42. }
  43. const (
  44. S_CHECKIAM = "S_XXX_IAM_checkiamService_S"
  45. S_ACCESSTOKEN = "S_XXX_IAM_accessToken_S"
  46. S_PROFILE = "S_XXX_IAM_profile_S"
  47. )
  48. // GetCheckiam 心跳检测 正常反馈OK
  49. func (s *OssServiceImpl) GetCheckiam(ctx context.Context) (response string, err error) {
  50. client := utils.UHttp.HttpClient(utils.MIMEPOSTForm, Config.System, S_CHECKIAM)
  51. var args = CheckiamReq{}
  52. args.ClientId = Config.ClientId
  53. args.ClientSecret = Config.ClientSecret
  54. args.NonceStr = grand.S(8, false)
  55. args.OauthTimestamp = gtime.TimestampMilli()
  56. sign, err := utils.USign.Encryption(args, Config.EncrySUffIx)
  57. if err != nil {
  58. }
  59. args.Sign = sign
  60. resp, err := client.Post(Config.AccessTokenUrl, utils.UStruct.Struct2Map(args))
  61. if err != nil {
  62. defer resp.Close()
  63. return response, err
  64. }
  65. response = resp.ReadAllString()
  66. fmt.Println(response, err)
  67. if err != nil {
  68. return response, err
  69. }
  70. return response, err
  71. }
  72. // GetAccessToken 单点登录获取token
  73. func (s *OssServiceImpl) GetAccessToken(ctx context.Context, code string) (response map[string]interface{}, err error) {
  74. client := utils.UHttp.HttpClient(utils.MIMEPOSTForm, Config.System, S_ACCESSTOKEN)
  75. var args = AccessTokenArgs{}
  76. args.ClientId = Config.ClientId
  77. args.ClientSecret = Config.ClientSecret
  78. args.NonceStr = grand.S(8, false)
  79. args.OauthTimestamp = gtime.TimestampMilli()
  80. args.Code = code
  81. args.GrantType = "authorization_code"
  82. args.RedirectUri = Config.RedirectUri
  83. sign, err := utils.USign.Encryption(args, Config.EncrySUffIx)
  84. if err != nil {
  85. }
  86. args.Sign = sign
  87. resp, err := client.Post(Config.AccessTokenUrl, utils.UStruct.Struct2Map(args))
  88. if err != nil {
  89. defer resp.Close()
  90. return response, err
  91. }
  92. responseData := resp.ReadAllString()
  93. response, err = utils.UStruct.String2Map(responseData)
  94. if err != nil {
  95. return response, err
  96. } else if gconv.Int(response["status"]) != 200 {
  97. return response, errors.New(gconv.String(response["msg"]))
  98. }
  99. return response, err
  100. }
  101. // GetUserInfo 获取用户信息
  102. func (s *OssServiceImpl) GetUserInfo(ctx context.Context, token string) (response map[string]interface{}, err error) {
  103. client := utils.UHttp.HttpClient(utils.MIMEPOSTForm, Config.System, S_PROFILE)
  104. var args = ProfileResq{}
  105. args.ClientId = Config.ClientId
  106. args.ClientSecret = Config.ClientSecret
  107. args.NonceStr = grand.S(8, false)
  108. args.OauthTimestamp = gtime.TimestampMilli()
  109. args.AccessToken = token
  110. //sign, err = utils.USign.EncryptionString(sign)
  111. sign, err := utils.USign.Encryption(args, Config.EncrySUffIx)
  112. if err != nil {
  113. return response, err
  114. }
  115. args.Sign = sign
  116. resp, err := client.Post(Config.ResourceUrl, utils.UStruct.Struct2Map(args))
  117. if err != nil {
  118. defer resp.Close()
  119. return response, err
  120. }
  121. responseData := resp.ReadAllString()
  122. response, err = utils.UStruct.String2Map(responseData)
  123. if err != nil {
  124. return response, err
  125. } else if gconv.Int(response["status"]) != 200 {
  126. return response, errors.New(gconv.String(response["msg"]))
  127. }
  128. return response, err
  129. }
  130. // 从context中获取ClientIP和UserAgent
  131. func GetBrowserInfo(ctx context.Context) (clientIP string, userAgent string, err error) {
  132. reqMeta := ctx.Value(share.ReqMetaDataKey).(map[string]string)
  133. clientIP, ok := reqMeta["clientIP"]
  134. if !ok {
  135. return "", "", errors.New("BrowserInfo获取失败")
  136. }
  137. userAgent, ok = reqMeta["userAgent"]
  138. if !ok {
  139. return "", "", errors.New("BrowserInfo获取失败")
  140. }
  141. userAgent, err = gbase64.DecodeToString(userAgent)
  142. return
  143. }
  144. // 获取大数登陆token
  145. func (s *OssServiceImpl) GetToken(ctx context.Context, record map[string]interface{}, tenant string) (interface{}, error) {
  146. var userInfo UserInfo
  147. //userInfo.Id = 907
  148. server, _ := NewService(tenant)
  149. glog.Info("单点登陆用户信息", record)
  150. userInfo.Uuid, _ = gmd5.Encrypt(gconv.String(record["id"])) //gconv.String(record["Uuid"]) //
  151. //userInfo.DeptId = "1" //gconv.String(record["DepartmentId"]) // 部门Id
  152. server.DB.Model("base_user").Where("uuid", userInfo.Uuid).Fields("Id,Uuid,UserName,RealName,DepartmentId as DeptId").Scan(&userInfo)
  153. userRoles, _ := server.DB.Model("base_user_role").Fields("RoleIds").Where("UserId", userInfo.Id).Value()
  154. userInfo.Roles = userRoles.String() // 角色
  155. dataByte, _ := json.Marshal(userInfo)
  156. rsp := &auth.Response{}
  157. err := authService.Call(ctx, "GetToken", &auth.Request{
  158. Tenant: tenant,
  159. UserKey: userInfo.UserName,
  160. Uuid: userInfo.Uuid,
  161. Data: string(dataByte),
  162. }, rsp)
  163. jsonData, _ := gjson.DecodeToJson(rsp.Data)
  164. cIP, userAgent, _ := GetBrowserInfo(ctx)
  165. gMap := g.Map{}
  166. ua := user_agent.New(userAgent)
  167. if err != nil {
  168. gMap["Status"] = 0
  169. gMap["LoginName"] = userInfo.UserName
  170. gMap["IpAddr"] = cIP
  171. gMap["LoginLocation"] = dautils.GetCityByIp(cIP)
  172. gMap["Browser"], _ = ua.Browser()
  173. gMap["Os"] = ua.OS()
  174. gMap["Msg"] = "单点登陆失败"
  175. gMap["LoginTime"] = gtime.Now()
  176. gMap["Module"] = "系统后台"
  177. } else {
  178. gMap["Status"] = 1
  179. gMap["LoginName"] = userInfo.UserName
  180. gMap["IpAddr"] = cIP
  181. gMap["LoginLocation"] = dautils.GetCityByIp(cIP)
  182. gMap["Browser"], _ = ua.Browser()
  183. gMap["Os"] = ua.OS()
  184. gMap["Msg"] = "单点登录成功"
  185. gMap["LoginTime"] = gtime.Now()
  186. gMap["Module"] = "系统后台"
  187. }
  188. glog.Info("jsonData", jsonData)
  189. if err != nil {
  190. return nil, err
  191. }
  192. go server.DB.Model("base_login_log").Data(gMap).Insert()
  193. return jsonData, nil
  194. }