SocialLogin.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using SharedKernel.Extensions;
  2. using Application.Abstractions.Messaging;
  3. using Web.Api.Extensions;
  4. using Web.Api.Common;
  5. namespace Web.Api.Endpoints.Auth;
  6. /// <summary>
  7. /// 소셜 로그인 (Naver/Kakao) — 프론트 콜백 라우트가 code/state 를 받아 호출 (d5 §④).
  8. /// 이메일 미제공(카카오 선택동의)은 Auth.EmailRequired, 미연동 기존 계정은 Auth.AccountExists 로 실패.
  9. /// </summary>
  10. internal sealed class SocialLogin : IEndpoint
  11. {
  12. public sealed record Request(
  13. string Provider,
  14. string Code,
  15. string? State,
  16. string? RedirectUri
  17. );
  18. public void MapEndpoint(IEndpointRouteBuilder app)
  19. {
  20. app.MapPost("api/auth/social-login", async (
  21. Request request,
  22. HttpContext httpContext,
  23. ISender sender,
  24. CancellationToken ct
  25. ) => {
  26. var ipAddress = httpContext.GetClientIP();
  27. var userAgent = httpContext.GetUserAgent();
  28. var command = new Application.Features.Api.Auth.SocialLogin.Command(
  29. request.Provider,
  30. request.Code,
  31. request.State,
  32. request.RedirectUri,
  33. ipAddress,
  34. userAgent
  35. );
  36. var result = await sender.Send(command, ct);
  37. return result.Match(
  38. data => ApiResponse.Ok(data),
  39. CustomResults.Problem
  40. );
  41. })
  42. .WithTags("Auth")
  43. .AllowAnonymous();
  44. }
  45. }