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 { /// /// 默认资源提供者 /// public class DefaultResourceHttpProvider : IResourceHttpProvider { public async Task SendAsStringAsync(HttpRequestBuilder builder) { var httpRemoteService = App.GetRequiredService(); 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; } } }