implement Phase 1-2

This commit is contained in:
Suphonchai Phoonsawat 2026-08-19 10:54:55 +07:00
parent 41573b3c4f
commit b976cf3124
23 changed files with 1291 additions and 79 deletions

View file

@ -0,0 +1,25 @@
using System.Security.Claims;
namespace WordVersioning.Api.Services;
public interface ICurrentUser
{
/// <summary>userId จาก claim `sub` เท่านั้น (FR-8 — ห้ามรับจาก client)</summary>
string UserId { get; }
/// <summary>username จาก claim `preferred_username` (ถ้ามี)</summary>
string? UserName { get; }
}
/// <summary>ดึง identity ของผู้เรียกจาก JWT claims — ใช้ตอนบันทึก CreatedByUserId / UpdatedByUserId</summary>
public class CurrentUser(IHttpContextAccessor accessor) : ICurrentUser
{
private readonly ClaimsPrincipal _principal =
accessor.HttpContext?.User ?? throw new InvalidOperationException("CurrentUser ต้องเรียกภายใน request ที่มี HttpContext");
public string UserId =>
_principal.FindFirst("sub")?.Value
?? throw new UnauthorizedAccessException("token ไม่มี claim 'sub'");
public string? UserName => _principal.FindFirst("preferred_username")?.Value;
}