app和小程序登录接口

This commit is contained in:
tongfei
2023-10-28 16:47:28 +08:00
parent 25e8a9e30a
commit 12073c36de
20 changed files with 997 additions and 5 deletions

View File

@@ -10,6 +10,7 @@ using System.Text;
using System.Threading.Tasks;
using WMS.Web.Core.Dto.Login;
using WMS.Web.Core.Dto.Login.Temp;
using WMS.Web.Core.Dto.Login.Temp.v3;
using WMS.Web.Core.Help;
using WMS.Web.Core.Internal.Results;
using WMS.Web.Core.Internal.Security;
@@ -67,6 +68,30 @@ namespace WMS.Web.Domain.Services.Public
});
}
/// <summary>
/// 创建token
/// </summary>
/// <param name="data"></param>
/// <param name="tempDto"></param>
/// <param name="NewToken"></param>
/// <returns></returns>
private async Task<AccessTokenDto> CreateToken(UserInfoDto data, LoginTempV2Dto tempDto, string NewToken)
{
return await Task.Run(() =>
{
DateTime expires_time = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)).AddSeconds(tempDto.access_expired_at);
AccessTokenDto accessToken = new AccessTokenDto()
{
Token = NewToken,
PhpToken = tempDto.access_token,
RefreshToken = tempDto.refresh_token,
Expired = expires_time
};
return accessToken;
});
}
/// <summary>
/// 得到单点用户信息
/// </summary>
@@ -190,6 +215,148 @@ namespace WMS.Web.Domain.Services.Public
}
}
/// <summary>
/// 获取单点用户信息
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
public async Task<Result<LoginInDto>> GetUserInfo(string username, string password)
{
//JsonObject reqData = new JsonObject();
//reqData.Add("client_id", _soaOptions.AppId);
//reqData.Add("client_secret", _soaOptions.AppSecret);
//reqData.Add("grant_type", "password");
//reqData.Add("username", username);
//reqData.Add("password", password);
var reqData = new LoginAuthorizeRequest();
reqData.ClientId = _soaOptions.AppId;
reqData.ClientSecret = _soaOptions.AppSecret;
reqData.GrantType = "password";
reqData.UserName = username;
reqData.Scope = "credentials";
var md5 = System.Security.Cryptography.MD5.Create();
var md5Pwd= BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)));
md5Pwd = md5Pwd.Replace("-", string.Empty);
reqData.Password = md5Pwd.ToLower();
//这个是登录的时候给前端验证的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 ? "成功" : "失败";
_logger.LogInformation($"登录信息APP和小程序单点->{login_result}");
if (jObject["code"] == 0)
{
string datajson = jObject["data"].ToString();
var _loginDto = JsonConvert.DeserializeObject<LoginTempV2Dto>(datajson);
#region
string enptStr = _loginDto.encrypted_data;
List<string> enptlist = enptStr.Trim().Split(',').ToList();
string str = RSA.DecryptSection(_soaOptions.PrivateKey, enptlist);
var entity = JsonConvert.DeserializeObject<LoginJsonTokenV3TempDto>(str);
#endregion
//映射登录信息
var userInfo_v3 = _mapper.Map<UserInfoV3Dto>(entity);
//userInfo_v3.Orgs = _mapper.Map<List<TagInfoDto>>(entity.orgs);
//userInfo_v3.Depts = _mapper.Map<List<TagInfoDto>>(entity.depts);
//userInfo_v3.Roles = _mapper.Map<List<TagInfoDto>>(entity.roles);
_logger.LogInformation($"登录信息用户ID->{entity.id}");
//HTTP请求获取登录信息人员客户供应商公司
var loginRequest = new LoginSingleRequest()
{
UserId = entity.id,
};
var loginResponse_result = await _singleDataService.GetSingleDataNoCache<Result<LoginSingleResponse>, 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.Staff != null)
{
r.UserInfo.StaffId = loginResponse.Staff.Id;
staffName = loginResponse.Staff.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.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<LoginInDto>($"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<LoginInDto>.ReFailure("授权失败,请重新登录", 401);
return Result<LoginInDto>.ReSuccess(r);
}
else
{
var errno_text = "登陆失败:" + jObject["errmsg"];
r.SignedIn = false;
string datajson_sessid = jObject["data"]["uc_sessid"];
//调用单点的退出接口
result = _httpClientHelp.GetHttp(_soaOptions.Url + "/uc/authorize/signin_out", true, cookieValue: datajson_sessid);
jObject = JsonObject.Parse(result);
if (jObject["errno"] == 0)
{
_logger.LogInformation("用户信息登录:" + errno_text);
return Result<LoginInDto>.ReFailure("拒绝用户证书试图访问此web站点请与站点管理员联系以建立用户证书权限", 403);
}
else
{
return Result<LoginInDto>.ReFailure(jObject["errmsg"], jObject["errno"]);
}
}
}
catch (Exception ex)
{
return Result<LoginInDto>.ReFailure("授权失败,请重新登录", 401);
}
}
/// <summary>
/// 登录退出
/// </summary>