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<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder);
|
Task<string> 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<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder)
|
{
|
return await httpRemoteService.SendAsAsync<TResponse>(builder);
|
}
|
|
public async Task<string> SendAsStringAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder)
|
{
|
return await httpRemoteService.SendAsStringAsync(builder);
|
}
|
}
|
|
public class TokenDataModel
|
{
|
/// <summary>
|
/// 用户访问令牌
|
/// </summary>
|
public string AccessToken { get; set; }
|
|
/// <summary>
|
/// 刷新令牌
|
/// </summary>
|
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<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder)
|
{
|
var response = await httpRemoteService.SendAsAsync<TResponse>(builder);
|
return response;
|
}
|
|
public async Task<string> 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<IDistributedCache>();
|
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<TokenDataModel>().ToJson();
|
distributedCache.SetString("SystemUserToken", token, new DistributedCacheEntryOptions
|
{
|
AbsoluteExpiration = DateTime.Now.AddMinutes(60 * 23)
|
});
|
}
|
var tokenData = token.JsonTo<TokenDataModel>();
|
return tokenData;
|
}
|
}
|
}
|