app和小程序登录接口
This commit is contained in:
@@ -19,6 +19,14 @@ namespace WMS.Web.Domain.IService.Public
|
||||
/// <returns></returns>
|
||||
Task<Result<LoginInDto>> GetUserInfoAsync(string code);
|
||||
|
||||
/// <summary>
|
||||
/// 获取单点用户信息
|
||||
/// </summary>
|
||||
/// <param name="username"></param>
|
||||
/// <param name="password"></param>
|
||||
/// <returns></returns>
|
||||
Task<Result<LoginInDto>> GetUserInfo(string username, string password);
|
||||
|
||||
/// <summary>
|
||||
/// 登录退出
|
||||
/// </summary>
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using WMS.Web.Core.Dto.Login;
|
||||
using WMS.Web.Core.Dto.Login.Temp;
|
||||
using WMS.Web.Core.Dto.Login.Temp.v3;
|
||||
|
||||
namespace WMS.Web.Domain.Mappers
|
||||
{
|
||||
@@ -14,7 +15,7 @@ namespace WMS.Web.Domain.Mappers
|
||||
{
|
||||
public AppMapper()
|
||||
{
|
||||
|
||||
//pc端登录的相关dto
|
||||
CreateMap<LoginJsonTokenTempDto, UserInfoDto>()
|
||||
.ForMember(x => x.Email, ops => ops.MapFrom(x => x.email))
|
||||
.ForMember(x => x.Avatar, ops => ops.MapFrom(x => x.avatar))
|
||||
@@ -25,10 +26,42 @@ namespace WMS.Web.Domain.Mappers
|
||||
.ReverseMap();
|
||||
|
||||
CreateMap<LoginJsonDeptTempDto, DeptInfoDto>()
|
||||
.ForMember(x => x.Id, ops => ops.MapFrom(x => x.id))
|
||||
.ForMember(x => x.DeptCode, ops => ops.MapFrom(x => x.dept_code))
|
||||
.ForMember(x => x.DeptName, ops => ops.MapFrom(x => x.dept_name))
|
||||
.ForMember(x => x.ManagerId, ops => ops.MapFrom(x => x.manager)).ReverseMap();
|
||||
.ForMember(x => x.Id, ops => ops.MapFrom(x => x.id))
|
||||
.ForMember(x => x.DeptCode, ops => ops.MapFrom(x => x.dept_code))
|
||||
.ForMember(x => x.DeptName, ops => ops.MapFrom(x => x.dept_name))
|
||||
.ForMember(x => x.ManagerId, ops => ops.MapFrom(x => x.manager)).ReverseMap();
|
||||
|
||||
//app端和小程序端登录的相关dto
|
||||
|
||||
|
||||
CreateMap<LoginJsonDeptV3TempDto, TagInfoDto>()
|
||||
.ForMember(x => x.Id, ops => ops.MapFrom(x => x.dept_id))
|
||||
.ForMember(x => x.Name, ops => ops.MapFrom(x => x.dept_name))
|
||||
.ForMember(x => x.Code, ops => ops.MapFrom(x => x.dept_code)).ReverseMap();
|
||||
CreateMap<LoginJsonCompanyTempDto, TagInfoDto>()
|
||||
.ForMember(x => x.Id, ops => ops.MapFrom(x => x.company_id))
|
||||
.ForMember(x => x.Name, ops => ops.MapFrom(x => x.company_name))
|
||||
.ForMember(x => x.Code, ops => ops.MapFrom(x => x.company_code)).ReverseMap();
|
||||
CreateMap<LoginJsonRoleTempDto, TagInfoDto>()
|
||||
.ForMember(x => x.Id, ops => ops.MapFrom(x => x.role_id))
|
||||
.ForMember(x => x.Name, ops => ops.MapFrom(x => x.role_name))
|
||||
.ForMember(x => x.Code, ops => ops.MapFrom(x => x.role_code)).ReverseMap();
|
||||
|
||||
CreateMap<LoginJsonTokenV3TempDto, UserInfoV3Dto>()
|
||||
.ForMember(x => x.Id, ops => ops.MapFrom(x => x.id))
|
||||
.ForMember(x => x.DingtalkUid, ops => ops.MapFrom(x => x.dingtalk_uid))
|
||||
.ForMember(x => x.DingtalkUnionid, ops => ops.MapFrom(x => x.dingtalk_unionid))
|
||||
.ForMember(x => x.Nickname, ops => ops.MapFrom(x => x.nickname))
|
||||
.ForMember(x => x.Realname, ops => ops.MapFrom(x => x.realname))
|
||||
.ForMember(x => x.Mobile, ops => ops.MapFrom(x => x.mobile))
|
||||
.ForMember(x => x.Identity, ops => ops.MapFrom(x => x.identity))
|
||||
.ForMember(x => x.Company, ops => ops.MapFrom(x => x.company))
|
||||
.ForMember(x => x.Orgs, opt => opt.Ignore())
|
||||
.ForMember(x => x.Depts, opt => opt.Ignore())
|
||||
.ForMember(x => x.Roles, opt => opt.Ignore()).ReverseMap();
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,11 @@ namespace WMS.Web.Domain.Options
|
||||
/// </summary>
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单点系统地址
|
||||
/// </summary>
|
||||
public string Url_V3 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 应用id
|
||||
/// </summary>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user