persistence/DD.Persistence.Client/Helpers/ApiTokenHelper.cs

98 lines
3.6 KiB
C#
Raw Normal View History

using DD.Persistence.Models.Configurations;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
2024-12-10 10:43:12 +05:00
using System.IdentityModel.Tokens.Jwt;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Text.Json;
namespace DD.Persistence.Client.Helpers;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> api-token
/// </summary>
2024-11-21 14:50:36 +05:00
public static class ApiTokenHelper
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="httpClient"></param>
/// <param name="configuration"></param>
/// <returns></returns>
2025-01-31 17:04:05 +05:00
public static void Authorize(this HttpClient httpClient, IConfiguration configuration)
2024-12-10 10:43:12 +05:00
{
var authUser = configuration
.GetSection(nameof(AuthUser))
.Get<AuthUser>()!;
var needUseKeyCloak = configuration
.GetSection("NeedUseKeyCloak")
.Get<bool>()!;
var keycloakGetTokenUrl = configuration.GetSection("KeycloakGetTokenUrl").Get<string>() ?? string.Empty;
2024-12-10 10:43:12 +05:00
var jwtToken = needUseKeyCloak
2025-01-31 17:04:05 +05:00
? authUser.CreateKeyCloakJwtToken(keycloakGetTokenUrl)
2024-12-10 10:43:12 +05:00
: authUser.CreateDefaultJwtToken();
2024-12-10 10:43:12 +05:00
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> jwt-<2D><><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="authUser"></param>
/// <returns></returns>
private static string CreateDefaultJwtToken(this AuthUser authUser)
{
var nameIdetifier = Guid.NewGuid().ToString();
var claims = new List<Claim>()
{
new(ClaimTypes.NameIdentifier, nameIdetifier),
new("client_id", authUser.ClientId),
new("username", authUser.Username),
new("password", authUser.Password),
new("grant_type", authUser.GrantType),
new(ClaimTypes.NameIdentifier.ToString(), Guid.NewGuid().ToString())
};
2024-12-10 10:43:12 +05:00
var tokenDescriptor = new SecurityTokenDescriptor
{
Issuer = JwtParams.Issuer,
Audience = JwtParams.Audience,
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddHours(1),
SigningCredentials = new SigningCredentials(JwtParams.SecurityKey, SecurityAlgorithms.HmacSha256Signature)
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> jwt-<2D><><EFBFBD><EFBFBD><EFBFBD> keycloak
/// </summary>
/// <param name="authUser"></param>
/// <param name="keycloakGetTokenUrl"></param>
/// <returns></returns>
2025-01-31 17:04:05 +05:00
private static string CreateKeyCloakJwtToken(this AuthUser authUser, string keycloakGetTokenUrl)
2024-12-10 10:43:12 +05:00
{
var sharedClient = new HttpClient();
var parameters = new Dictionary<string, string> {
{ "username", authUser.Username },
{ "password", authUser.Password },
{ "client_id", authUser.ClientId },
{ "grant_type", authUser.GrantType },
};
var encodedContent = new FormUrlEncodedContent(parameters);
2025-01-31 17:04:05 +05:00
using HttpResponseMessage response = sharedClient.PostAsync(keycloakGetTokenUrl, encodedContent).GetAwaiter().GetResult();
if (response.IsSuccessStatusCode == true)
2024-12-10 10:43:12 +05:00
{
2025-01-31 17:04:05 +05:00
var data = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
var token = JsonSerializer.Deserialize<JwtToken>(data)!;
2024-12-10 10:43:12 +05:00
return token.AccessToken;
}
return String.Empty;
}
2024-11-21 14:50:36 +05:00
}