刷新token方法优化

This commit is contained in:
tongfei
2024-01-08 10:58:47 +08:00
parent 2596ac58ed
commit ffc0e01020
9 changed files with 167 additions and 3 deletions

View File

@@ -19,6 +19,8 @@ using WMS.Web.Domain.Infrastructure;
using WMS.Web.Domain.IService; using WMS.Web.Domain.IService;
using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.IService.Public;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using WMS.Web.Domain.Options;
using Microsoft.Extensions.Options;
namespace WMS.Web.Api.Controllers namespace WMS.Web.Api.Controllers
{ {
@@ -38,12 +40,14 @@ namespace WMS.Web.Api.Controllers
private readonly ITakeStockRepositories _takeStockRepositories; private readonly ITakeStockRepositories _takeStockRepositories;
private readonly IOutStockService _outStockService; private readonly IOutStockService _outStockService;
private readonly IWebHostEnvironment _env; private readonly IWebHostEnvironment _env;
private readonly AppOptions _options;
public TestController(IErpService erpService, IInStockTaskService inStockTaskService, IBoxInventoryRepositories boxInventoryRepositories, public TestController(IErpService erpService, IInStockTaskService inStockTaskService, IBoxInventoryRepositories boxInventoryRepositories,
IBasicsRepositories transactionRepositories, IOpsService opsService, IBoxService boxService, IBasicsRepositories transactionRepositories, IOpsService opsService, IBoxService boxService,
IOutStockTaskRepositories outStockTaskRepositories, IOutStockTaskService outStockTaskService, IOutStockTaskRepositories outStockTaskRepositories, IOutStockTaskService outStockTaskService, IOptions<AppOptions> options,
ITakeStockService takeStockService, ITakeStockRepositories takeStockRepositories, IOutStockService outStockService, ITakeStockService takeStockService, ITakeStockRepositories takeStockRepositories, IOutStockService outStockService,
IWebHostEnvironment env) IWebHostEnvironment env)
{ {
_options = options?.Value;
_boxInventoryRepositories = boxInventoryRepositories; _boxInventoryRepositories = boxInventoryRepositories;
this._erpService = erpService; this._erpService = erpService;
this._inStockTaskService = inStockTaskService; this._inStockTaskService = inStockTaskService;
@@ -318,5 +322,17 @@ namespace WMS.Web.Api.Controllers
return result; return result;
} }
/// <summary>
/// 测试-接口是否正常
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("lst")]
public string Lst()
{
var successStr = "tongfei test lst->数据库链接地址:" + _options.DBConnectionString+",单点项目链接地址:"+_options.SingleBaseUrl;
return successStr;
}
} }
} }

View File

@@ -614,5 +614,11 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Api.Controllers.TestController.Lst">
<summary>
测试-接口是否正常
</summary>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@@ -3552,6 +3552,21 @@
</summary> </summary>
</member> </member>
<member name="P:WMS.Web.Core.Dto.Login.LoginAuthorizeRefreshTokenRequest.ClientId">
<summary>
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.Login.LoginAuthorizeRefreshTokenRequest.ClientSecret">
<summary>
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.Login.LoginAuthorizeRefreshTokenRequest.GrantType">
<summary>
</summary>
</member>
<member name="T:WMS.Web.Core.Dto.Login.LoginSingleRequest"> <member name="T:WMS.Web.Core.Dto.Login.LoginSingleRequest">
<summary> <summary>
登录后:请求相关全部信息对象 登录后:请求相关全部信息对象

View File

@@ -3226,6 +3226,14 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.IService.Public.ILoginService.RefreshTokenNew(System.String,System.String)">
<summary>
刷新token
</summary>
<param name="Token"></param>
<param name="RefreshToken"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.IService.Public.ILoginService.LoginOutSingleAsync(System.Int32,System.String,System.Int32)"> <member name="M:WMS.Web.Domain.IService.Public.ILoginService.LoginOutSingleAsync(System.Int32,System.String,System.Int32)">
<summary> <summary>
单点退出通知token失效 单点退出通知token失效
@@ -4836,6 +4844,14 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.Services.Public.LoginService.RefreshTokenNew(System.String,System.String)">
<summary>
刷新token
</summary>
<param name="Token"></param>
<param name="RefreshToken"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.Public.LoginService.LoginOutSingleAsync(System.Int32,System.String,System.Int32)"> <member name="M:WMS.Web.Domain.Services.Public.LoginService.LoginOutSingleAsync(System.Int32,System.String,System.Int32)">
<summary> <summary>
单点退出通知token失效 单点退出通知token失效

View File

@@ -61,4 +61,26 @@ namespace WMS.Web.Core.Dto.Login
public string Scope { get; set; } public string Scope { get; set; }
} }
public class LoginAuthorizeRefreshTokenRequest
{
/// <summary>
///
/// </summary>
public string ClientId { get; set; }
/// <summary>
///
/// </summary>
public string ClientSecret { get; set; }
/// <summary>
///
/// </summary>
public string GrantType { get; set; }
public string RefreshToken { get; set; }
public string Scope { get; set; }
}
} }

View File

@@ -143,6 +143,35 @@ namespace WMS.Web.Core.Help
} }
public string PostHttp(string url, LoginAuthorizeRefreshTokenRequest reqData)
{
var str = string.Format("client_id={0}&client_secret={1}&grant_type={2}&refresh_token={3}&scope={4}",
reqData.ClientId, reqData.ClientSecret, reqData.GrantType, reqData.RefreshToken, 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 GetHttpOut(string url, LoginOutAuthorizeRequest reqData) public string GetHttpOut(string url, LoginOutAuthorizeRequest reqData)
{ {
try try

View File

@@ -66,6 +66,14 @@ namespace WMS.Web.Domain.IService.Public
/// <returns></returns> /// <returns></returns>
Task<Result<LoginInDto>> RefreshToken(string OldToken, string RefreshToken); Task<Result<LoginInDto>> RefreshToken(string OldToken, string RefreshToken);
/// <summary>
/// 刷新token
/// </summary>
/// <param name="Token"></param>
/// <param name="RefreshToken"></param>
/// <returns></returns>
Task<Result<LoginInDto>> RefreshTokenNew(string Token, string RefreshToken);
/// <summary> /// <summary>
/// 单点退出通知token失效 /// 单点退出通知token失效
/// </summary> /// </summary>

View File

@@ -565,6 +565,57 @@ namespace WMS.Web.Domain.Services.Public
} }
} }
/// <summary>
/// 刷新token
/// </summary>
/// <param name="Token"></param>
/// <param name="RefreshToken"></param>
/// <returns></returns>
public async Task<Result<LoginInDto>> RefreshTokenNew(string Token, string RefreshToken)
{
//1.根据旧token 找到登录对象
var loginInfo = _redisClientService.GetStringKey<LoginInDto>($"wms_login_{Token}");
var reqData = new LoginAuthorizeRefreshTokenRequest();
reqData.ClientId = _soaOptions.AppId;
reqData.ClientSecret = _soaOptions.AppSecret;
reqData.GrantType = "refresh_token";
reqData.RefreshToken = RefreshToken;
reqData.Scope = "credentials";
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();
if (jObject["code"] == 0)
{
string datajson = jObject["data"].ToString();
var _loginDto = JsonConvert.DeserializeObject<LoginTempV2Dto>(datajson);
r.UserInfo = loginInfo.UserInfo;
r.SignedIn = true;
var token = await CreateToken(loginInfo.UserInfo, _loginDto, Token);
r.TokenInfo = token;
loginInfo.TokenInfo = token;
_logger.LogInformation("RefreshToken:我在刷新登录:刷新后的过期时间-1>" + token.Expired.ToString());
var ops_login_time = token.Expired.AddDays(1) - DateTime.Now;//用于正式
_redisClientService.SetStringKey<LoginInDto>($"wms_login_{token.Token}", loginInfo, ops_login_time);
_logger.LogInformation("RefreshToken:我在刷新登录:刷新后的过期时间-小时->" + ops_login_time.Hours);
return Result<LoginInDto>.ReSuccess(r);
}
else
{
//失败了1就把登录的token清除 2 ucid添加到黑名单
var time = new TimeSpan(r.TokenInfo.Expired.Day, r.TokenInfo.Expired.Hour, r.TokenInfo.Expired.Minute, r.TokenInfo.Expired.Second, r.TokenInfo.Expired.Millisecond);
_redisClientService.SetStringKey($"wms_black_token_{r.UserInfo.UcId}", r.TokenInfo.Token, time);
this.RemoveLoginInfo(r.TokenInfo.Token);
r.SignedIn = false;
return Result<LoginInDto>.ReFailure(jObject["errmsg"], jObject["errno"]);
}
}
/// <summary> /// <summary>
/// 单点退出通知token失效 /// 单点退出通知token失效
/// </summary> /// </summary>

View File

@@ -131,11 +131,12 @@ namespace WMS.Web.Repositories.DependencyInjection
UcId = logininfo.UserInfo.UcId.ToString(), UcId = logininfo.UserInfo.UcId.ToString(),
SessionId = logininfo.UserInfo.SeesionId, SessionId = logininfo.UserInfo.SeesionId,
Token = logininfo.TokenInfo.Token, Token = logininfo.TokenInfo.Token,
RefreshToken=logininfo.TokenInfo.RefreshToken,
AccessToken = logininfo.TokenInfo.PhpToken, AccessToken = logininfo.TokenInfo.PhpToken,
ExpiresIn = logininfo.TokenInfo.Expired ExpiresIn = logininfo.TokenInfo.Expired
}; };
var res = await loginService.LoginOutAsync(dto); var res = await loginService.LoginOut(dto);
return; return;
} }
} }
@@ -165,7 +166,7 @@ namespace WMS.Web.Repositories.DependencyInjection
/// <returns></returns> /// <returns></returns>
private bool RefreshToken(string OldToken, string RefreshToken, ILoginService _loginService) private bool RefreshToken(string OldToken, string RefreshToken, ILoginService _loginService)
{ {
var res = _loginService.RefreshToken(OldToken, RefreshToken); var res = _loginService.RefreshTokenNew(OldToken, RefreshToken);
if (!res.Result.Success) if (!res.Result.Success)
return false; return false;
else else