using FlexJobApi.Core.Models.ElectronSignServer.Auths; using FlexJobApi.Core.Models.ElectronSignServer.Common; using Furion; using Furion.HttpRemote; using Mapster; using Microsoft.Extensions.Caching.Distributed; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// /// 电子签资源提供者 /// public class ElectronSignServerResourceHttpProvider : IResourceHttpProvider { public async Task SendAsStringAsync(HttpRequestBuilder builder) { var httpRemoteService = App.GetRequiredService(); builder = WithToken(httpRemoteService, builder); var response = await httpRemoteService.SendAsStringAsync(builder); try { var result = response.JsonTo(new { Code = 0 }); if (result.Code == 401) { builder = WithToken(httpRemoteService, builder, true); response = await httpRemoteService.SendAsStringAsync(builder); } } catch { } return response; } private HttpRequestBuilder WithToken(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder, bool recache = false) { var cacheKey = "ElectronSignServerSystemUserToken"; var distributedCache = App.GetRequiredService(); var token = distributedCache.GetString(cacheKey); if (token == null || recache) { var result = httpRemoteService.PostAs>($"{builder.RequestUri.Scheme}://{builder.RequestUri.Authority}/api/Account/GetTokenForWeb", builder => builder.SetJsonContent(new AccessRequestDto { UserName = "system", UserPassword = "qwe321" })); if (result.Success) { token = new TokenDataModel { AccessToken = result.Result.AccessToken, RefreshToken = result.Result.RefreshToken }.ToJson(); distributedCache.SetString(cacheKey, token, new DistributedCacheEntryOptions { AbsoluteExpiration = DateTime.Now.AddMinutes(60 * 23) }); } } if (token.IsNotNull()) { var model = token.JsonTo(); if (model.AccessToken.IsNotNull()) { builder = builder.AddAuthentication(new AuthenticationHeaderValue("Authorization", model.AccessToken)); } if (model.RefreshToken.IsNotNull()) { builder = builder.AddAuthentication(new AuthenticationHeaderValue("X-Authorization", model.RefreshToken)); } } return builder; } } }