-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* wip: 변경사항 공유를 위한 커밋 * fix: toast provider에 use client directive 추가 * feat: 클라이언트에서 사용 가능한 getCookie 함수 구현 * feat: oauth redirect 요청 시 profile이 없는 경우 프로필 추가 페이지로 이동하는 route handler 구현 - cookie, token 관련 constants key 상수로 분리 * fix: auth 확인을 위한 localstorage 의존성을 session(server action)으로 이동 * fix: react query provider use client 추가 * refactor: layout ContextProvider 컴포넌트 제거, AuthFailedErrorBoundary 위치 수정 * feat: middleware에 profile 추가 등록 페이지로 이동하는 기능 추가 - 세션 관련 함수 디렉토리 구조 수정 * chore: 불필요한 주석 제거 * fix: getOrigin server action에서도 사용할 수 있도록 개선 * fix: cookie samesite lax로 수정 * fix: 로그아웃시 document 쿠키도 함께 제거 * fix: AuthFailedErrorBoundary 무한 reset 되지 않도록 재시도 가능한 fallback 렌더링 * chore: 불필요한 parameter 제거 * chore: /app/layout에 불필요한 async 제거 * fix: middleware 내부에서 토큰 삭제하는 로직 제거, logout 에러 핸들링 로직 추가
- Loading branch information
Showing
24 changed files
with
496 additions
and
157 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
import { cookies } from 'next/headers'; | ||
import { redirect } from 'next/navigation'; | ||
|
||
import { COOKIE_KEYS, SEARCH_PARAMS_KEYS } from '@/constants'; | ||
import { isAuthRefreshError } from '@/utils/helpers'; | ||
import { createQueryString } from '@/utils/url'; | ||
import { getOrigin } from '@/lib/request/getOrigin'; | ||
import { | ||
getAuthSession, | ||
setProfileSession, | ||
deleteAuthSession, | ||
} from '@/server/session'; | ||
|
||
const REDIRECT_SEARCH_KEY = SEARCH_PARAMS_KEYS.REDIRECT_PATHNAME; | ||
|
||
interface RetryRequest extends Request { | ||
retried?: boolean; // fetch 재시도 시 true로 설정 | ||
} | ||
|
||
// GET /profile/redirect | ||
export async function GET(request: Request) { | ||
const { searchParams } = new URL(request.url); | ||
const destination = searchParams.get(REDIRECT_SEARCH_KEY); | ||
|
||
const accessToken = cookies().get(COOKIE_KEYS.ACCESS_TOKEN); | ||
|
||
if (accessToken) { | ||
const _request: RetryRequest = request.clone(); | ||
_request.retried = false; | ||
|
||
let response: Response; | ||
|
||
try { | ||
response = await fetchMyProfile(_request, accessToken.value); | ||
} catch (error) { | ||
console.log('Caught error, redirect to root!\n', error); | ||
await deleteAuthSession(); | ||
return redirect('/'); | ||
} | ||
|
||
const data = await response.json(); | ||
const hasProfile = Boolean(data?.nickname && data?.job?.jobGroupName); | ||
|
||
await setProfileSession(hasProfile); | ||
|
||
if (!hasProfile) { | ||
const search = createQueryString({ | ||
...(destination && { [REDIRECT_SEARCH_KEY]: destination }), | ||
}); | ||
redirect(`/profile/me/add${search}`); | ||
} else if (destination) { | ||
redirect(`${destination}`); | ||
} else { | ||
redirect('/bookarchive'); | ||
} | ||
} | ||
|
||
return redirect('/'); | ||
} | ||
|
||
/* | ||
* 내 프로필 조회 | ||
*/ | ||
const fetchMyProfile = async ( | ||
request: RetryRequest, | ||
token: string | ||
): Promise<Response> => { | ||
const origin = getOrigin(new URL(request.url), request.headers); | ||
const response = await fetch(`${origin}/service-api/users/me`, { | ||
headers: { | ||
Accept: '*/*', | ||
'Content-Type': 'application/json', | ||
Authorization: `Bearers ${token}`, | ||
}, | ||
}); | ||
|
||
if (!response.ok) { | ||
// fetch 1번만 재시도 | ||
if (!request.retried) { | ||
const error = await response.json(); | ||
const code = error.code || ''; | ||
|
||
if (isAuthRefreshError(code)) { | ||
// 새로운 auth 세션 쿠키 설정 | ||
const newToken = await getAuthSession(); | ||
if (!newToken) { | ||
throw Error('Failed to get access token'); | ||
} | ||
|
||
// 재시도 flag 설정 | ||
request.retried = true; | ||
|
||
// 재요청 | ||
return fetchMyProfile(request, newToken); | ||
} | ||
} | ||
|
||
throw Error('Failed to get my profile', { cause: response }); | ||
} | ||
|
||
return response; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
'use client'; | ||
|
||
import { createContext, ReactNode, useMemo, useState } from 'react'; | ||
|
||
import type { | ||
|
Oops, something went wrong.