刷新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.Public;
using Microsoft.Extensions.Hosting;
using WMS.Web.Domain.Options;
using Microsoft.Extensions.Options;
namespace WMS.Web.Api.Controllers
{
@@ -38,12 +40,14 @@ namespace WMS.Web.Api.Controllers
private readonly ITakeStockRepositories _takeStockRepositories;
private readonly IOutStockService _outStockService;
private readonly IWebHostEnvironment _env;
private readonly AppOptions _options;
public TestController(IErpService erpService, IInStockTaskService inStockTaskService, IBoxInventoryRepositories boxInventoryRepositories,
IBasicsRepositories transactionRepositories, IOpsService opsService, IBoxService boxService,
IOutStockTaskRepositories outStockTaskRepositories, IOutStockTaskService outStockTaskService,
IOutStockTaskRepositories outStockTaskRepositories, IOutStockTaskService outStockTaskService, IOptions<AppOptions> options,
ITakeStockService takeStockService, ITakeStockRepositories takeStockRepositories, IOutStockService outStockService,
IWebHostEnvironment env)
{
_options = options?.Value;
_boxInventoryRepositories = boxInventoryRepositories;
this._erpService = erpService;
this._inStockTaskService = inStockTaskService;
@@ -318,5 +322,17 @@ namespace WMS.Web.Api.Controllers
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>
<returns></returns>
</member>
<member name="M:WMS.Web.Api.Controllers.TestController.Lst">
<summary>
测试-接口是否正常
</summary>
<returns></returns>
</member>
</members>
</doc>

View File

@@ -3552,6 +3552,21 @@
</summary>
</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">
<summary>
登录后:请求相关全部信息对象

View File

@@ -3226,6 +3226,14 @@
</summary>
<returns></returns>
</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)">
<summary>
单点退出通知token失效
@@ -4836,6 +4844,14 @@
</summary>
<returns></returns>
</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)">
<summary>
单点退出通知token失效

View File

@@ -61,4 +61,26 @@ namespace WMS.Web.Core.Dto.Login
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)
{
try

View File

@@ -66,6 +66,14 @@ namespace WMS.Web.Domain.IService.Public
/// <returns></returns>
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>
/// 单点退出通知token失效
/// </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>
/// 单点退出通知token失效
/// </summary>

View File

@@ -131,11 +131,12 @@ namespace WMS.Web.Repositories.DependencyInjection
UcId = logininfo.UserInfo.UcId.ToString(),
SessionId = logininfo.UserInfo.SeesionId,
Token = logininfo.TokenInfo.Token,
RefreshToken=logininfo.TokenInfo.RefreshToken,
AccessToken = logininfo.TokenInfo.PhpToken,
ExpiresIn = logininfo.TokenInfo.Expired
};
var res = await loginService.LoginOutAsync(dto);
var res = await loginService.LoginOut(dto);
return;
}
}
@@ -165,7 +166,7 @@ namespace WMS.Web.Repositories.DependencyInjection
/// <returns></returns>
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)
return false;
else