update api key
Some checks failed
release-dev / release-dev (push) Failing after 12s

This commit is contained in:
kittapath 2025-11-12 01:56:06 +07:00
parent b478b9eded
commit b4cc522fef
32 changed files with 413 additions and 412 deletions

View file

@ -95,13 +95,13 @@ namespace BMA.EHR.Domain.Middlewares
// หลังจาก Authentication middleware ทำงานแล้ว ลองดึง claims อีกครั้ง
if (context.User?.Identity?.IsAuthenticated == true)
{
var authenticatedKeycloakId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value
var authenticatedKeycloakId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value
?? context.User.FindFirst("sub")?.Value;
if (!string.IsNullOrEmpty(authenticatedKeycloakId) && authenticatedKeycloakId != keycloakId)
{
keycloakId = authenticatedKeycloakId;
Console.WriteLine($"Updated keycloakId from authenticated user: {keycloakId}");
// อัพเดต profile ด้วย keycloakId ที่ถูกต้อง
try
{
@ -143,7 +143,7 @@ namespace BMA.EHR.Domain.Middlewares
{
stopwatch.Stop();
await LogRequest(context, client, startTime, stopwatch, pf, keycloakId, requestBodyJson, memoryStream, caughtException);
// เขียนข้อมูลกลับไปยัง original Response body
if (memoryStream.Length > 0)
{
@ -164,7 +164,7 @@ namespace BMA.EHR.Domain.Middlewares
{
var form = await context.Request.ReadFormAsync();
var formData = new Dictionary<string, object>();
foreach (var field in form)
{
formData[field.Key] = field.Value.ToString();
@ -185,23 +185,23 @@ namespace BMA.EHR.Domain.Middlewares
formData["Files"] = fileDataList;
}
var jsonOptions = new JsonSerializerOptions
{
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
};
return JsonSerializer.Serialize(formData, jsonOptions);
}
else
{
var jsonOptions = new JsonSerializerOptions
{
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
};
return JsonSerializer.Serialize(JsonSerializer.Deserialize<object>(requestBody), jsonOptions);
}
@ -222,8 +222,8 @@ namespace BMA.EHR.Domain.Middlewares
var response = context.Response;
var statusCode = response.StatusCode;
string? message = null;
string? responseBodyJson = null;
if (memoryStream.Length > 0)
@ -261,16 +261,16 @@ namespace BMA.EHR.Domain.Middlewares
if (!response.HasStarted && ShouldFormatResponse(statusCode))
{
Console.WriteLine($"Formatting response for status: {statusCode}");
var responseModel = CreateResponseModel(statusCode,message);
var responseModel = CreateResponseModel(statusCode, message);
// Clear memory stream และเขียน response ใหม่
memoryStream.SetLength(0);
memoryStream.Position = 0;
// ไม่เปลี่ยน status code ที่ Authentication middleware ตั้งไว้
response.ContentType = "application/json; charset=utf-8";
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
@ -278,22 +278,22 @@ namespace BMA.EHR.Domain.Middlewares
};
var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions);
var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse);
// กำหนด Content-Length ให้ตรงกับขนาดจริง
response.ContentLength = bytes.Length;
await memoryStream.WriteAsync(bytes, 0, bytes.Length);
Console.WriteLine($"Response formatted successfully: {jsonResponse}");
}
// หากเป็น 401/403 แต่ยังไม่มี response body ให้สร้างใหม่
else if (!response.HasStarted && (statusCode == 401 || statusCode == 403) && memoryStream.Length == 0)
{
Console.WriteLine($"Creating response body for {statusCode} status");
var responseModel = CreateResponseModel(statusCode,message);
var responseModel = CreateResponseModel(statusCode, message);
response.ContentType = "application/json; charset=utf-8";
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
@ -301,12 +301,12 @@ namespace BMA.EHR.Domain.Middlewares
};
var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions);
var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse);
// กำหนด Content-Length ให้ตรงกับขนาดจริง
response.ContentLength = bytes.Length;
await memoryStream.WriteAsync(bytes, 0, bytes.Length);
Console.WriteLine($"Response body created: {jsonResponse}");
}
}
@ -325,7 +325,7 @@ namespace BMA.EHR.Domain.Middlewares
try
{
Console.WriteLine($"FormatExceptionResponse: Error={error.Message}");
if (context?.Response == null)
return;
@ -337,7 +337,7 @@ namespace BMA.EHR.Domain.Middlewares
// Clear memory stream และเขียน error response
memoryStream.SetLength(0);
memoryStream.Position = 0;
response.StatusCode = (int)HttpStatusCode.InternalServerError;
response.ContentType = "application/json; charset=utf-8";
@ -355,13 +355,13 @@ namespace BMA.EHR.Domain.Middlewares
};
var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions);
var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse);
// กำหนด Content-Length ให้ตรงกับขนาดจริง
response.ContentLength = bytes.Length;
await memoryStream.WriteAsync(bytes, 0, bytes.Length);
Console.WriteLine($"Exception response formatted: {jsonResponse}");
}
else
@ -379,16 +379,16 @@ namespace BMA.EHR.Domain.Middlewares
}
}
private async Task LogRequest(HttpContext context, ElasticClient client, DateTime startTime, Stopwatch stopwatch,
private async Task LogRequest(HttpContext context, ElasticClient client, DateTime startTime, Stopwatch stopwatch,
GetProfileByKeycloakIdLocal? pf, string keycloakId, string? requestBodyJson, MemoryStream memoryStream, Exception? caughtException)
{
try
{
var processTime = stopwatch.ElapsedMilliseconds;
var endTime = DateTime.UtcNow;
var statusCode = caughtException != null ? (int)HttpStatusCode.InternalServerError : context.Response.StatusCode;
var logType = caughtException != null ? "error" : statusCode switch
{
>= 500 => "error",
@ -404,7 +404,7 @@ namespace BMA.EHR.Domain.Middlewares
{
memoryStream.Seek(0, SeekOrigin.Begin);
var responseBody = new StreamReader(memoryStream).ReadToEnd();
if (!string.IsNullOrEmpty(responseBody))
{
var contentType = context.Response.ContentType;
@ -424,12 +424,12 @@ namespace BMA.EHR.Domain.Middlewares
{
try
{
var jsonOptions = new JsonSerializerOptions
{
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
};
responseBodyJson = JsonSerializer.Serialize(JsonSerializer.Deserialize<object>(responseBody), jsonOptions);
@ -501,7 +501,7 @@ namespace BMA.EHR.Domain.Middlewares
statusCode == (int)HttpStatusCode.InternalServerError;
}
private static ResponseObject CreateResponseModel(int statusCode,string? error)
private static ResponseObject CreateResponseModel(int statusCode, string? error)
{
var message = statusCode switch
{
@ -544,7 +544,7 @@ namespace BMA.EHR.Domain.Middlewares
}
var token = authorizationHeader.Replace("Bearer ", "");
// แยก JWT token เพื่อดึง payload (แบบง่าย โดยไม่ verify signature)
var parts = token.Split('.');
if (parts.Length != 3)
@ -554,7 +554,7 @@ namespace BMA.EHR.Domain.Middlewares
// Decode Base64 payload
var payload = parts[1];
// เพิ่ม padding ถ้าจำเป็น
var padLength = 4 - (payload.Length % 4);
if (padLength != 4)
@ -564,15 +564,15 @@ namespace BMA.EHR.Domain.Middlewares
var payloadBytes = Convert.FromBase64String(payload);
var payloadJson = System.Text.Encoding.UTF8.GetString(payloadBytes);
Console.WriteLine($"JWT Payload: {payloadJson}");
// Parse JSON และดึง sub (subject) claim
var jsonDoc = JsonDocument.Parse(payloadJson);
// ลองหา keycloak ID ใน claims ต่างๆ
string? keycloakId = null;
if (jsonDoc.RootElement.TryGetProperty("sub", out var subElement))
{
keycloakId = subElement.GetString();
@ -602,7 +602,7 @@ namespace BMA.EHR.Domain.Middlewares
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api_key", apiKey);
client.DefaultRequestHeaders.Add("api-key", apiKey);
var _res = await client.GetAsync(apiPath);
if (_res.IsSuccessStatusCode)
{