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
|
{
|
/// <summary>
|
/// 电子签资源提供者
|
/// </summary>
|
public class ElectronSignServerResourceHttpProvider : 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 = "ElectronSignServerSystemUserToken";
|
var distributedCache = App.GetRequiredService<IDistributedCache>();
|
var token = distributedCache.GetString(cacheKey);
|
if (token == null || recache)
|
{
|
var result = httpRemoteService.PostAs<ElectronSignServerResult<IdentityModelTokenCacheItem>>($"{builder.RequestUri.Scheme}://{builder.RequestUri.Authority}/api/Account/GetTokenForWeb", builder =>
|
builder.SetJsonContent(new AccessRequestDto
|
{
|
UserName = "system",
|
UserPassword = "qwe321"
|
}));
|
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<TokenDataModel>();
|
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;
|
}
|
}
|
}
|