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 SystemUserResourceHttpProvider : 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 = "SystemUserToken"; var distributedCache = App.GetRequiredService(); var token = distributedCache.GetString(cacheKey); if (token == null || recache) { var logier = new CurrentLogier { Id = new Guid("11111111-1111-1111-1111-111111111111"), Name = "管理员", UserName = "system", Type = EnumUserType.Operation, ClientType = EnumClientType.PcWeb, Level = 999, }; JwtUtils.GenerateToken(logier); token = logier.Adapt().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.WithHeader("Authorization", model.AccessToken); } if (model.RefreshToken.IsNotNull()) { builder = builder.WithHeader("X-Authorization", model.RefreshToken); } } return builder; } } public class TokenDataModel { /// /// 用户访问令牌 /// public string AccessToken { get; set; } /// /// 刷新令牌 /// public string RefreshToken { get; set; } } }