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.AddAuthentication(new AuthenticationHeaderValue("Authorization", model.AccessToken));
}
if (model.RefreshToken.IsNotNull())
{
builder = builder.AddAuthentication(new AuthenticationHeaderValue("X-Authorization", model.RefreshToken));
}
}
return builder;
}
}
public class TokenDataModel
{
///
/// 用户访问令牌
///
public string AccessToken { get; set; }
///
/// 刷新令牌
///
public string RefreshToken { get; set; }
}
}