using Furion;
|
using Furion.DatabaseAccessor;
|
using Furion.DataEncryption;
|
using Furion.HttpRemote;
|
using Microsoft.EntityFrameworkCore;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Net.Http.Headers;
|
using System.Security.Claims;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace FlexJobApi.Core
|
{
|
/// <summary>
|
/// 默认资源提供者
|
/// </summary>
|
public class DefaultResourceHttpProvider : IResourceHttpProvider
|
{
|
public async Task<string> SendAsStringAsync(HttpRequestBuilder builder)
|
{
|
var httpRemoteService = App.GetRequiredService<IHttpRemoteService>();
|
builder = WithHeader(builder, "Authorization");
|
builder = WithHeader(builder, "X-Authorization");
|
var response = await httpRemoteService.SendAsStringAsync(builder);
|
try
|
{
|
var result = response.JsonTo(new
|
{
|
Code = 0
|
});
|
if (result.Code == 401)
|
{
|
var accessToken = GetHeaderValue(builder, "Authorization");
|
var logier = await accessToken.GetCurrentLogier();
|
if (logier != null)
|
{
|
builder = WithHeader(builder, "Authorization", logier.AccessToken);
|
builder = WithHeader(builder, "X-Authorization", logier.RefreshToken);
|
response = await httpRemoteService.SendAsStringAsync(builder);
|
}
|
}
|
}
|
catch { }
|
return response;
|
}
|
|
public string GetHeaderValue(HttpRequestBuilder builder, string name)
|
{
|
string value = null;
|
if (builder.Headers?.ContainsKey(name) ?? false)
|
{
|
value = builder.Headers[name].ToString();
|
}
|
else if (App.HttpContext.Request.Headers.ContainsKey(name))
|
{
|
value = App.HttpContext.Request.Headers[name].ToString();
|
}
|
return value;
|
}
|
|
private HttpRequestBuilder WithHeader(HttpRequestBuilder builder, string name, string value = null)
|
{
|
value ??= GetHeaderValue(builder, name);
|
if (value.IsNotNull())
|
{
|
builder = builder.WithHeader(name, value);
|
}
|
return builder;
|
}
|
}
|
}
|