diff --git a/src/Contracts/Masa.Mc.Contracts.Admin/Infrastructure/TokenGenerater.cs b/src/Contracts/Masa.Mc.Contracts.Admin/Infrastructure/TokenGenerater.cs new file mode 100644 index 00000000..142bddb6 --- /dev/null +++ b/src/Contracts/Masa.Mc.Contracts.Admin/Infrastructure/TokenGenerater.cs @@ -0,0 +1,51 @@ +// Copyright (c) MASA Stack All rights reserved. +// Licensed under the Apache License. See LICENSE.txt in the project root for license information. + +namespace Masa.Mc.Contracts.Admin.Infrastructure; + +public class TokenGenerater : ITokenGenerater +{ + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly HttpClient _httpClient; + private readonly IMasaStackConfig _masaStackConfig; + private const string SCHEME = "Bearer "; + + public TokenGenerater(IHttpContextAccessor httpContextAccessor, HttpClient httpClient, IMasaStackConfig masaStackConfig) + { + _httpContextAccessor = httpContextAccessor; + _httpClient = httpClient; + _masaStackConfig = masaStackConfig; + } + + public TokenProvider Generater() + { + StringValues authenticationHeaderValue; + + if (_httpContextAccessor.HttpContext?.Request.Headers.TryGetValue("Authorization", out authenticationHeaderValue) == true) + { + var accessToken = authenticationHeaderValue.ToString(); + + if (!string.IsNullOrEmpty(accessToken) && accessToken.StartsWith(SCHEME, StringComparison.OrdinalIgnoreCase)) + { + accessToken = accessToken.Substring(SCHEME.Length).Trim(); + } + + return new TokenProvider { AccessToken = accessToken }; + } + + if (_httpContextAccessor.HttpContext == null) + { + var request = new ClientCredentialsTokenRequest + { + Address = _masaStackConfig.GetSsoDomain() + "/connect/token", + GrantType = BuildingBlocks.Authentication.OpenIdConnect.Models.Constans.GrantType.CLIENT_CREDENTIALS, + ClientId = _masaStackConfig.GetWebId(MasaStackProject.MC), + Scope = "MasaStack" + }; + var tokenResponse = _httpClient.RequestClientCredentialsTokenAsync(request).Result; + return new TokenProvider { AccessToken = tokenResponse.AccessToken }; + } + + return new TokenProvider(); + } +} diff --git a/src/Contracts/Masa.Mc.Contracts.Admin/Masa.Mc.Contracts.Admin.csproj b/src/Contracts/Masa.Mc.Contracts.Admin/Masa.Mc.Contracts.Admin.csproj index 9ac19018..ff725e45 100644 --- a/src/Contracts/Masa.Mc.Contracts.Admin/Masa.Mc.Contracts.Admin.csproj +++ b/src/Contracts/Masa.Mc.Contracts.Admin/Masa.Mc.Contracts.Admin.csproj @@ -12,6 +12,7 @@ + diff --git a/src/Contracts/Masa.Mc.Contracts.Admin/_Imports.cs b/src/Contracts/Masa.Mc.Contracts.Admin/_Imports.cs index 2e4b1583..eab68325 100644 --- a/src/Contracts/Masa.Mc.Contracts.Admin/_Imports.cs +++ b/src/Contracts/Masa.Mc.Contracts.Admin/_Imports.cs @@ -25,4 +25,9 @@ global using System.Reflection; global using System.Collections.ObjectModel; global using System.ComponentModel.DataAnnotations; -global using System.Collections.Concurrent; \ No newline at end of file +global using System.Collections.Concurrent; +global using IdentityModel.Client; +global using Masa.BuildingBlocks.StackSdks.Config; +global using Masa.Contrib.StackSdks.Caller; +global using Masa.Contrib.StackSdks.Config; +global using Microsoft.Extensions.Primitives; \ No newline at end of file diff --git a/src/Services/Masa.Mc.Service/Program.cs b/src/Services/Masa.Mc.Service/Program.cs index 1bb8ff44..b980110e 100644 --- a/src/Services/Masa.Mc.Service/Program.cs +++ b/src/Services/Masa.Mc.Service/Program.cs @@ -1,8 +1,6 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the Apache License. See LICENSE.txt in the project root for license information. -using Masa.Mc.Infrastructure.Weixin.Work.Extensions; - var builder = WebApplication.CreateBuilder(args); ValidatorOptions.Global.LanguageManager = new MasaLanguageManager(); @@ -97,6 +95,7 @@ Password = masaStackConfig.RedisModel.RedisPassword }; var configuration = builder.Services.GetMasaConfiguration().ConfigurationApi.GetDefault(); +builder.Services.AddScoped(); builder.Services.AddAuthClient(masaStackConfig.GetAuthServiceDomain(), redisOptions); builder.Services.AddMcClient(masaStackConfig.GetMcServiceDomain()); builder.Services.AddPmClient(masaStackConfig.GetPmServiceDomain()); diff --git a/src/Services/Masa.Mc.Service/_Imports.cs b/src/Services/Masa.Mc.Service/_Imports.cs index fa1ef42b..47e8f713 100644 --- a/src/Services/Masa.Mc.Service/_Imports.cs +++ b/src/Services/Masa.Mc.Service/_Imports.cs @@ -114,6 +114,7 @@ global using Masa.Mc.Infrastructure.Weixin.Work.Sender; global using Masa.Mc.Infrastructure.Weixin.Work.Work; global using Masa.Mc.Infrastructure.Weixin.Work.WorkWebhook; +global using Masa.Mc.Infrastructure.Weixin.Work.Extensions; global using Masa.Mc.Service.Admin.Application.Channels.Commands; global using Masa.Mc.Service.Admin.Application.Channels.Queries; global using Masa.Mc.Service.Admin.Application.MessageInfos.Commands; @@ -181,7 +182,10 @@ global using Microsoft.Extensions.DependencyInjection.Extensions; global using Microsoft.Extensions.Options; global using Microsoft.OpenApi.Models; +global using Microsoft.Extensions.Primitives; global using Moq; global using static AlibabaCloud.SDK.Dysmsapi20170525.Models.QuerySmsTemplateListResponseBody; global using ICsvExporter = Masa.Mc.Infrastructure.ExporterAndImporter.Csv.ICsvExporter; global using ICsvImporter = Masa.Mc.Infrastructure.ExporterAndImporter.Csv.ICsvImporter; +global using IdentityModel.Client; +global using Masa.Contrib.StackSdks.Caller; \ No newline at end of file diff --git a/src/Web/Masa.Mc.Web.Admin.Server/Program.cs b/src/Web/Masa.Mc.Web.Admin.Server/Program.cs index 7a592dbb..9980cd3e 100644 --- a/src/Web/Masa.Mc.Web.Admin.Server/Program.cs +++ b/src/Web/Masa.Mc.Web.Admin.Server/Program.cs @@ -39,6 +39,7 @@ mcBaseAddress = masaStackConfig.GetMcServiceDomain(); } +builder.Services.AddScoped(); await builder.Services.AddMasaStackComponentsAsync(MasaStackProject.MC, "wwwroot/i18n", authBaseAddress); builder.Services.AddHttpContextAccessor(); diff --git a/src/Web/Masa.Mc.Web.Admin.Server/_Imports.cs b/src/Web/Masa.Mc.Web.Admin.Server/_Imports.cs index e53bced7..7a4721bc 100644 --- a/src/Web/Masa.Mc.Web.Admin.Server/_Imports.cs +++ b/src/Web/Masa.Mc.Web.Admin.Server/_Imports.cs @@ -28,4 +28,5 @@ global using FluentValidation.Resources; global using Masa.BuildingBlocks.StackSdks.Config; global using Masa.Contrib.Configuration.ConfigurationApi.Dcc; -global using Masa.Contrib.StackSdks.Caller; \ No newline at end of file +global using Masa.Contrib.StackSdks.Caller; +global using Masa.Mc.Contracts.Admin.Infrastructure; \ No newline at end of file