diff --git a/src/WMS.Web.Api/Controllers/LoginController.cs b/src/WMS.Web.Api/Controllers/LoginController.cs index 6ba7956e..d2a8ddbd 100644 --- a/src/WMS.Web.Api/Controllers/LoginController.cs +++ b/src/WMS.Web.Api/Controllers/LoginController.cs @@ -32,7 +32,8 @@ namespace WMS.Web.Api.Controllers [Route("LoginIn")] public async Task> LoginIn([FromQuery] string code) { - var result = await _loginService.GetUserInfoAsync(code); + //var result = await _loginService.GetUserInfoAsync(code); + var result = await _loginService.GetUserInfoByCode(code); return result; } diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index 9928dc74..6a87800e 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -3537,6 +3537,21 @@ + + + + + + + + + + + + + + + 登录后:请求相关全部信息对象 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 1102c4b9..013da79d 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -3191,6 +3191,13 @@ + + + + + + + 获取单点用户信息 @@ -4788,6 +4795,13 @@ + + + 获取单点登录信息 + + + + 获取单点用户信息 diff --git a/src/WMS.Web.Core/Dto/Login/LoginRequest.cs b/src/WMS.Web.Core/Dto/Login/LoginRequest.cs index 9c9316de..9ee94226 100644 --- a/src/WMS.Web.Core/Dto/Login/LoginRequest.cs +++ b/src/WMS.Web.Core/Dto/Login/LoginRequest.cs @@ -39,4 +39,26 @@ namespace WMS.Web.Core.Dto.Login public string Scope { get; set; } } + + public class LoginAuthorizeCodeRequest + { + /// + /// + /// + public string ClientId { get; set; } + + /// + /// + /// + public string ClientSecret { get; set; } + + /// + /// + /// + public string GrantType { get; set; } + + public string Code { get; set; } + + public string Scope { get; set; } + } } diff --git a/src/WMS.Web.Core/Help/HttpClientHelp.cs b/src/WMS.Web.Core/Help/HttpClientHelp.cs index fee590ab..014427e0 100644 --- a/src/WMS.Web.Core/Help/HttpClientHelp.cs +++ b/src/WMS.Web.Core/Help/HttpClientHelp.cs @@ -114,6 +114,35 @@ namespace WMS.Web.Core.Help } + public string PostHttp(string url, LoginAuthorizeCodeRequest reqData) + { + var str = string.Format("client_id={0}&client_secret={1}&grant_type={2}&code={3}&scope={4}", + reqData.ClientId, reqData.ClientSecret, reqData.GrantType, reqData.Code,reqData.Scope); + ASCIIEncoding encoding = new ASCIIEncoding(); + byte[] byte1 = encoding.GetBytes(str); + HttpContent httpContent = new StringContent(str); + httpContent.Headers.Expires = DateTime.Now; + httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); + httpContent.Headers.ContentLength = byte1.Length; + httpContent.Headers.ContentType.CharSet = "utf-8"; + HttpClient httpClient = new HttpClient(); + httpClient.BaseAddress = new Uri(url); + httpClient.Timeout = new TimeSpan(0, 0, 10); + HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result; + if (response.IsSuccessStatusCode) + { + var resData = response.Content.ReadAsStringAsync().Result; + return resData; + + } + else + { + var resData = response.Content.ReadAsStringAsync().Result; + return resData; + } + + } + public string PostHttpNoData(string url, string cookieValue = "") { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); diff --git a/src/WMS.Web.Domain/IService/Public/ILoginService.cs b/src/WMS.Web.Domain/IService/Public/ILoginService.cs index 739ed416..3b16f76e 100644 --- a/src/WMS.Web.Domain/IService/Public/ILoginService.cs +++ b/src/WMS.Web.Domain/IService/Public/ILoginService.cs @@ -30,6 +30,13 @@ namespace WMS.Web.Domain.IService.Public /// Task> GetUserInfoAsync(string code); + /// + /// + /// + /// + /// + Task> GetUserInfoByCode(string code); + /// /// 获取单点用户信息 /// diff --git a/src/WMS.Web.Domain/Services/Public/LoginService.cs b/src/WMS.Web.Domain/Services/Public/LoginService.cs index 523b720d..003b8cab 100644 --- a/src/WMS.Web.Domain/Services/Public/LoginService.cs +++ b/src/WMS.Web.Domain/Services/Public/LoginService.cs @@ -216,6 +216,114 @@ namespace WMS.Web.Domain.Services.Public } } + /// + /// 获取单点登录信息 + /// + /// + /// + public async Task> GetUserInfoByCode(string code) + { + var reqData = new LoginAuthorizeCodeRequest(); + reqData.ClientId = _soaOptions.AppId; + reqData.ClientSecret = _soaOptions.AppSecret; + reqData.GrantType = "authorization_code"; + reqData.Code = code; + reqData.Scope = "credentials"; + + //这个是登录的时候给前端验证的token,以及传给php单点那边的一个session值,用于单点退出时,通知ops退出 + string NewToken = Guid.NewGuid().ToString("N"); + try + { + string result = _httpClientHelp.PostHttp(_soaOptions.Url_V3 + "/uc/authorize", reqData); + var jObject = JsonObject.Parse(result); + LoginInDto r = new LoginInDto(); + r.UserInfo = new UserInfoDto(); + r.TokenInfo = new AccessTokenDto(); + var login_result = jObject["code"] == 0 ? "成功" : "失败"; + + if (jObject["code"] == 0) + { + string datajson = jObject["data"].ToString(); + var _loginDto = JsonConvert.DeserializeObject(datajson); + + #region 解码 + string enptStr = _loginDto.encrypted_data; + List enptlist = enptStr.Trim().Split(',').ToList(); + string str = RSA.DecryptSection(_soaOptions.PrivateKey, enptlist); + var entity = JsonConvert.DeserializeObject(str); + #endregion + + //映射登录信息 + var userInfo_v3 = _mapper.Map(entity); + _logger.LogInformation($"登录信息:用户ID->{entity.id}"); + //HTTP请求获取登录信息:人员,客户,供应商,公司 + var loginRequest = new LoginSingleRequest() + { + UserId = entity.id, + + }; + var loginResponse_result = await _singleDataService.GetSingleDataNoCache, LoginSingleRequest, SingleLoginAction> + (loginRequest, SingleLoginAction.Staff, type: SingleControllerType.Login); + + //绑定返回对象的登录信息 + var staffName = "Null"; + var token = await CreateToken(r.UserInfo, _loginDto, NewToken); + r.TokenInfo = token; + if (loginResponse_result.Success && loginResponse_result.Data != null) + { + var loginResponse = loginResponse_result.Data; + if (loginResponse != null) + { + r.UserInfo.StaffId = loginResponse.Id; + staffName = loginResponse.Name; + } + } + r.UserInfo.CompanyId = userInfo_v3.Company.Id; + r.UserInfo.CompanyName = userInfo_v3.Company.Name; + r.UserInfo.UcId = userInfo_v3.Id; + r.UserInfo.SeesionId = "";//app和程序类型登录授权没有这个字段 + r.UserInfo.Nickname = userInfo_v3.Nickname; + r.UserInfo.Mobile = userInfo_v3.Mobile; + r.UserInfo.Identity = userInfo_v3.Identity; + r.UserInfo.OrgId = entity.orgs.FirstOrDefault()?.org_id; + r.UserInfo.CustomerId = null; + r.UserInfo.SupplierId = null; + r.SignedIn = true; + _logger.LogInformation($"登录信息:用户人员信息->{staffName}({r.UserInfo.StaffId}),公司名称->{r.UserInfo.CompanyName}"); + + //登录后缓存登录的用户信息和token信息 + var loginInfo = new LoginInDto(); + loginInfo.UserInfo = r.UserInfo; + loginInfo.TokenInfo = token; + + var ops_login_time = token.Expired.AddDays(1) - DateTime.Now;//用于正式 + _redisClientService.SetStringKey($"wms_login_{token.Token}", loginInfo, ops_login_time); + + //登录成功移出对应的用户token黑名单:应为新的token产生,移除登录的信息 + string blacktoken = _redisClientService.GetStringKey($"wms_black_token_{r.UserInfo.UcId}"); + if (!string.IsNullOrEmpty(blacktoken)) + { + this.RemoveLoginInfo(blacktoken); + _redisClientService.RemoveStringKey($"wms_black_token_{r.UserInfo.UcId}"); + } + if (r == null || r.UserInfo == null || r.TokenInfo == null) + return Result.ReFailure("授权失败,请重新登录", 401); + return Result.ReSuccess(r); + } + else + { + var errno_text = "登录失败:" + jObject["message"]; + _logger.LogInformation("登陆失败:" + errno_text); + return Result.ReFailure(errno_text, 401); + } + } + catch (Exception ex) + { + _logger.LogInformation("登录错误信息:" + ex.Message); + return Result.ReFailure("授权失败,请重新登录", 401); + } + } + /// /// 获取单点用户信息 ///