auth.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. 'use server';
  2. import { cookies } from 'next/headers';
  3. import { ResultDto } from '@/dtos/response/common';
  4. import { LoginRequest, RegisterRequest, VerifyEmailRequest, ResendEmailRequest, ForgotPasswordRequest, ResetPasswordRequest } from '@/dtos/request/auth';
  5. import { LoginResponse } from '@/dtos/response/auth';
  6. import { fetchJson, getAccessToken, getRefreshToken } from '@/lib/utils/server';
  7. // 로그인
  8. export async function fetchLogin(request: LoginRequest): Promise<ResultDto<LoginResponse>> {
  9. const res = await fetchJson<LoginResponse>('/api/auth/login', {
  10. method: 'POST',
  11. body: JSON.stringify(request)
  12. });
  13. if (res.success && res.data) {
  14. const cookie = await cookies();
  15. const option = {
  16. httpOnly: true, path: '/'
  17. };
  18. cookie.set('accessToken', res.data.accessToken, option);
  19. cookie.set('refreshToken', res.data.refreshToken, option);
  20. }
  21. return res;
  22. }
  23. // 로그아웃
  24. export async function fetchLogout(): Promise<ResultDto> {
  25. const res = await fetchJson('/api/auth/logout', {
  26. method: 'POST'
  27. });
  28. if (res.success) {
  29. const cookie = await cookies();
  30. cookie.delete('accessToken');
  31. cookie.delete('refreshToken');
  32. }
  33. return res;
  34. }
  35. // 회원가입 요청
  36. export async function fetchRegister(request: RegisterRequest): Promise<ResultDto> {
  37. return await fetchJson('/api/auth/register', {
  38. method: 'POST',
  39. body: JSON.stringify(request)
  40. });
  41. }
  42. // 회원가입 완료
  43. export async function Registration(email: string|null): Promise<ResultDto> {
  44. const cookie = (await cookies()).get('isVerified-Registration');
  45. return await fetchJson(`/api/auth/registration/${email}`, {
  46. method: 'GET',
  47. headers: {
  48. 'Cookie': `isVerified-Registration=${cookie?.value || ""}`
  49. }
  50. });
  51. }
  52. // 비밀번호 찾기
  53. export async function fetchForgotPassword(request: ForgotPasswordRequest): Promise<ResultDto> {
  54. return await fetchJson(`/api/auth/forgot-password`, {
  55. method: 'POST',
  56. body: JSON.stringify(request)
  57. });
  58. }
  59. // 인증번호 확인
  60. export async function fetchVerifyEmail(request: VerifyEmailRequest): Promise<ResultDto> {
  61. return await fetchJson('/api/auth/verify-email', {
  62. method: 'POST',
  63. body: JSON.stringify(request)
  64. });
  65. }
  66. // 인증번호 다시 받기
  67. export async function fetchResendEmail(params: ResendEmailRequest): Promise<ResultDto> {
  68. return await fetchJson('/api/auth/resend-email', {
  69. method: 'POST',
  70. body: JSON.stringify(params)
  71. });
  72. }
  73. // 비밀번호 변경
  74. export async function fetchResetPassword(params: ResetPasswordRequest): Promise<ResultDto> {
  75. const cookie = (await cookies()).get('isVerified-ForgotPassword');
  76. return await fetchJson('/api/auth/reset-password', {
  77. method: 'POST',
  78. headers: {
  79. 'Cookie': `isVerified-ForgotPassword=${cookie?.value || ""}`
  80. },
  81. body: JSON.stringify(params)
  82. });
  83. }
  84. // RefreshToken으로 AccessToken 갱신
  85. export async function refreshAccessToken(): Promise<boolean>
  86. {
  87. const refreshToken = await getRefreshToken();
  88. if (!refreshToken) {
  89. return false;
  90. }
  91. return await fetchJson('/api/auth/refresh-token', {
  92. method: 'POST',
  93. body: JSON.stringify({ RefreshToken: refreshToken })
  94. }).then(res => res.success);
  95. }
  96. // 로그인 확인
  97. export async function checkAuthServer(): Promise<boolean>
  98. {
  99. const accessToken = await getAccessToken();
  100. if (accessToken) {
  101. try {
  102. const payload = JSON.parse(
  103. Buffer.from(accessToken.split('.')[1], 'base64').toString()
  104. );
  105. if (payload.exp * 1000 > Date.now()) {
  106. return true;
  107. }
  108. } catch {
  109. }
  110. }
  111. return await refreshAccessToken();
  112. }