This commit is contained in:
parent
b478b9eded
commit
b4cc522fef
32 changed files with 413 additions and 412 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue