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 = App.GetConfig("ElectronSignServer:Account"),
UserPassword = App.GetConfig("ElectronSignServer:Password")
}));
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.WithHeader("Authorization", model.AccessToken);
}
if (model.RefreshToken.IsNotNull())
{
builder = builder.WithHeader("X-Authorization", model.RefreshToken);
}
}
return builder;
}
}
}