using Azure; using Azure.Core; using Furion; using Furion.FriendlyException; using Furion.HttpRemote; using Furion.Shapeless; using Mapster; using Microsoft.Extensions.Caching.Distributed; using Newtonsoft.Json; 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 interface IResourceHttpProvider { HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder); Task SendAsAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder); Task SendAsStringAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder); } public class DefaultResourceHttpProvider : IResourceHttpProvider { public HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder) { var token = App.HttpContext.Request.Headers["Authorization"].ToString(); var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString(); return builder .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)); } public async Task SendAsAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder) { return await httpRemoteService.SendAsAsync(builder); } public async Task SendAsStringAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder) { return await httpRemoteService.SendAsStringAsync(builder); } } public class TokenDataModel { /// /// 用户访问令牌 /// public string AccessToken { get; set; } /// /// 刷新令牌 /// public string RefreshToken { get; set; } } public class SystemUserResourceHttpProvider : IResourceHttpProvider { public HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder) { var token = GetToken(); return builder .WithHeader("Authorization", "Bearer " + token.AccessToken) .WithHeader("X-Authorization", "Bearer " + token.RefreshToken); } public async Task SendAsAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder) { var response = await httpRemoteService.SendAsAsync(builder); return response; } public async Task SendAsStringAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder) { var response = await httpRemoteService.SendAsStringAsync(builder); try { var result = response.JsonTo(new { Code = 0 }); if (result.Code == 401) { var token = GetToken(true); builder = builder .WithHeader("Authorization", "Bearer " + token.AccessToken) .WithHeader("X-Authorization", "Bearer " + token.RefreshToken); response = await httpRemoteService.SendAsStringAsync(builder); } } catch { } return response; } private TokenDataModel GetToken(bool recache = false) { var distributedCache = App.GetRequiredService(); var token = distributedCache.GetString("SystemUserToken"); 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("SystemUserToken", token, new DistributedCacheEntryOptions { AbsoluteExpiration = DateTime.Now.AddMinutes(60 * 23) }); } var tokenData = token.JsonTo(); return tokenData; } } }