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
|
{
|
/// <summary>
|
/// 系统管理员资源提供者
|
/// </summary>
|
public class SystemUserResourceHttpProvider : IResourceHttpProvider
|
{
|
public async Task<string> SendAsStringAsync(HttpRequestBuilder builder)
|
{
|
var httpRemoteService = App.GetRequiredService<IHttpRemoteService>();
|
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<IDistributedCache>();
|
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<TokenDataModel>().ToJson();
|
distributedCache.SetString(cacheKey, token, new DistributedCacheEntryOptions
|
{
|
AbsoluteExpiration = DateTime.Now.AddMinutes(60 * 23)
|
});
|
}
|
if (token.IsNotNull())
|
{
|
var model = token.JsonTo<TokenDataModel>();
|
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
|
{
|
/// <summary>
|
/// 用户访问令牌
|
/// </summary>
|
public string AccessToken { get; set; }
|
|
/// <summary>
|
/// 刷新令牌
|
/// </summary>
|
public string RefreshToken { get; set; }
|
}
|
}
|