| | |
| | | using Furion; |
| | | 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; |
| | |
| | | { |
| | | HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder); |
| | | Task<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder); |
| | | Task<string> SendAsStringAsync(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder); |
| | | } |
| | | |
| | | public class DefaultResourceHttpProvider : IResourceHttpProvider |
| | |
| | | |
| | | public async Task<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder) |
| | | { |
| | | var response = await httpRemoteService.SendAsAsync<TResponse>(builder); |
| | | dynamic clay = Clay.Parse(response); |
| | | if (clay.Code == 401) |
| | | { |
| | | Console.WriteLine(); |
| | | throw new Exception(); |
| | | return await httpRemoteService.SendAsAsync<TResponse>(builder); |
| | | } |
| | | else |
| | | |
| | | 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; |
| | | } |
| | | } |
| | | } |