NiceAuthOptions.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. namespace Infrastructure.Kyc.Nice;
  3. /// <summary>
  4. /// NICE 통합인증 API 설정. appsettings.{env}.json 의 "Nice:Auth" 섹션 + Secret File 로 주입.
  5. ///
  6. /// ClientId / ClientSecret 가 비어 있으면 <see cref="NiceAuthClient"/> 가
  7. /// "Nice.NotConfigured" 에러를 반환. dev 환경에서 vendor 미연동 상태로 진행 가능 (Developers:SkipKyc=true 와 짝).
  8. /// </summary>
  9. public sealed class NiceAuthOptions
  10. {
  11. /// <summary>NICE API base URL. 예: https://svc.niceapi.co.kr:22001</summary>
  12. public string BaseUrl { get; set; } = string.Empty;
  13. /// <summary>NICE 발급 client_id.</summary>
  14. public string ClientId { get; set; } = string.Empty;
  15. /// <summary>NICE 발급 client_secret. Secret File 에만 보관.</summary>
  16. public string ClientSecret { get; set; } = string.Empty;
  17. /// <summary>NICE 발급 사이트코드 (SITECODE). 휴대폰 본인확인 신청서 식별자. 일부 보조 API 에 필요.</summary>
  18. public string SiteCode { get; set; } = string.Empty;
  19. /// <summary>
  20. /// 인증 후 NICE → 가맹점 callback URL 의 base 부분 (sessionToken 은 Backend 가 path segment 로 append).
  21. /// 예: https://api.dpot.live/api/developers/profile/kyc/callback
  22. /// </summary>
  23. public string ReturnUrl { get; set; } = string.Empty;
  24. /// <summary>표준창 닫기 버튼 클릭 시 이동 URL (Frontend 의 onboarding/kyc 페이지 권장).</summary>
  25. public string CloseUrl { get; set; } = string.Empty;
  26. /// <summary>
  27. /// Backend callback 결과를 사용자에게 보여줄 Frontend 페이지 URL.
  28. /// 예: https://developers.dpot.live/onboarding/kyc/callback
  29. /// (Backend 가 ?ok=1 또는 ?ok=0&message=... 으로 query 추가해 302 redirect)
  30. /// </summary>
  31. public string FrontendCallbackUrl { get; set; } = string.Empty;
  32. /// <summary>기본 인증수단. "M" 휴대폰 / "F" 금융인증서 / "U" 공동인증서 / "I" 아이핀.</summary>
  33. public string[] DefaultSvcTypes { get; set; } = ["M"];
  34. /// <summary>표준창 method_type. 기본 "GET" (가이드에 POST field 명세 없어 안전 선택).</summary>
  35. public string MethodType { get; set; } = "GET";
  36. /// <summary>Redis 토큰 캐시 키 prefix. e.g. "Nice:Auth:Token"</summary>
  37. public string TokenCacheKeyPrefix { get; set; } = "Nice:Auth:Token";
  38. /// <summary>토큰 캐시 TTL (초). NICE 토큰이 24h 라 safety margin 1h 빼고 23h = 82800 권장.</summary>
  39. public int TokenCacheTtlSeconds { get; set; } = 82800;
  40. /// <summary>HTTP 호출 timeout (초).</summary>
  41. public int HttpTimeoutSeconds { get; set; } = 15;
  42. /// <summary>Secret File 미주입 시 배포 config 에 남는 미치환 placeholder 접두사.</summary>
  43. private const string PlaceholderPrefix = "__INJECT_";
  44. /// <summary>
  45. /// 설정 완료(=vendor 연동 가능) 여부. BaseUrl/ClientId/ClientSecret 가 모두 채워져야 함.
  46. /// Secret File 미주입으로 남은 미치환 placeholder(__INJECT_...) 는 미설정으로 간주 —
  47. /// NICE 에 가짜 client_id 를 보내 "권한 오류(1006)" 가 나는 대신 "준비 중(NotConfigured)" 으로 안전 처리.
  48. /// </summary>
  49. public bool IsConfigured =>
  50. !string.IsNullOrWhiteSpace(BaseUrl) &&
  51. !string.IsNullOrWhiteSpace(ClientId) &&
  52. !string.IsNullOrWhiteSpace(ClientSecret) &&
  53. !ClientId.StartsWith(PlaceholderPrefix, StringComparison.Ordinal) &&
  54. !ClientSecret.StartsWith(PlaceholderPrefix, StringComparison.Ordinal);
  55. /// <summary>
  56. /// 배포 config 에 치환 안 된 placeholder(__INJECT_...) 가 남아있는지.
  57. /// true 면 "설정한 듯 보이나 실제론 미주입" 상태 → 부팅 시 운영자 경고 대상.
  58. /// </summary>
  59. public bool HasUnsubstitutedPlaceholder =>
  60. ClientId.StartsWith(PlaceholderPrefix, StringComparison.Ordinal) ||
  61. ClientSecret.StartsWith(PlaceholderPrefix, StringComparison.Ordinal);
  62. }