๋ค์์ ์ด๊ธฐ์ ๋ด๊ฐ ๋ฐ๋๋ ๊ธฐ๋ฅ์ด๋ค.
- ๋ก๊ทธ์ธ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๊ทผ ์ ํ: /signin ์ด์ธ์ ๋ชจ๋ route
- ๋ก๊ทธ์ธ ์ํ์ผ ๊ฒฝ์ฐ ์ ๊ทผ ์ ํ: /signin (๋ก๊ทธ์ธ ์ฑ๊ณต ์งํ ์ด ํ์ด์ง์์ ๋ฒ์ด๋๋๋ก.)
์ค์ ํ์ด์ง์ ์ ๊ทผ ํ ๋ฆฌ๋ค์ด๋ ํธ๋๊ฒ ๋๋ฉด ๋ถํ์ํ ํ๋ฉด ์ด๋์ด ์์ ๋ฟ๋ง ์๋๋ผ ํ๋ฉด ๊น๋ฐ์๋ ์๊ฒจ์, ์ฌ์ฉ์ ๊ฒฝํ์ ์ข์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฐ๋ฐ ํด๋ผ์ด์ธํธ์์ ํ์ด์ง๋ฅผ ๊ตฌ๋ถํ๊ณ ์ํ๋ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ ๊ฒฝ์ฐ ์๊ฒฉ์ด ์๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ์ ๋ ์ผ์์ ์ผ๋ก ํ๋ฉด์ด ํ์๋ ํ ํ์ด์ง๊ฐ ๋ฆฌ๋ค์ด๋ ํธ๋๋ฉด์ ๊น๋ฐ๊ฑฐ๋ฆฐ๋ค.
Next.js ๋ฌธ์๋ฅผ ๋ค์ ธ๋ณด๋, middleware.ts ํ์ผ์์ ์์ฒญํ๋ฉด API ๋ผ์ฐํธ ๋๋ ํ์ด์ง ์์ฒญ ์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ณดํธํด์ผ ํ ๊ฒฝ๋ก์ ๋ํ ์ด๊ธฐ ์ ๊ทผ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค. ๋๋ ์ธ์ ์ ๊ฐ์ ธ์์ middleware์์ ์ฒดํฌ๋ฅผ ์งํํ๋๋ฐ, ์ด ๋ถ๋ถ์์ ์ธ์ ์ ์ฌ์ฉํด๋ ๊ด์ฐฎ์์ง ์ดํ ๋ณด์ ๊ด๋ จํด์ ๋ ์ฐพ์๋ณด๊ณ ์์ ํ ๊ฒ ๊ฐ๋ค.
// ๋ก๊ทธ์ธํด์ผ ์ ๊ทผํ ์ ์๋ ๋ฃจํธ[]
const protectedRoutes = ['/today', '/calendar']
export async function middleware(request: NextRequest) {
const response = await updateSession(request)
const supabase = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
/* ์ฟ ํค get/set/remove ์ค์ */
},
},
)
// session ๊ฐ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ฆฌ๋ค์ด๋ ์
const { data: { session }, error} = await supabase.auth.getSession()
if (request.nextUrl.pathname === '/signin' && session) {
url.pathname = '/'
return NextResponse.redirect(url)
}
if (protectedRoutes.includes(request.nextUrl.pathname)) {
if (!session) {
url.pathname = '/signin'
return NextResponse.redirect(url)
}
}
if(error) {
console.error(error)
}
return response
}
๊ทธ๋ฐ๋ฐ ์ ์ฝ๋๋ฅผ ์ ์ฉํ ์ดํ ๋ช๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ค.
- ๋ก๊ทธ์ธ ์์ด ํ์ด์ง์ ์ ๊ทผ๋ง ํด๋ ์ธ์ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๊ธฐ ๋๋ฌธ์ ์ฝ์์ ์ธ์ ์๋ค๊ณ ๋ฌ๋ค.
- ์ผ๋ฐ ๋ก๊ทธ์ธ ์ฑ๊ณต์ '/' ๋ก ์ด๋ํ์ ๋ ์ธ์ ๋ง ๋จผ์ ์ฒดํฌํ๊ณ /๋ก ์ด๋ํด์, ์ ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ ์์ง ์๊ณ ์๋ก๊ณ ์นจํด์ผ ๋ค์ด์จ๋ค. (task createํ๋ ค๊ณ ํ๋ฉด user.id๊ฐ null์ด๋ผ๊ณ ํ์คํฌ ์ถ๊ฐ๊ฐ ์๋๋ค.)
- OAuth ๋ก๊ทธ์ธ ์ฑ๊ณต์ '/signin'์ ๋ฒ์ด๋์ง ์๊ณ '/signin'์ ๋ค์ ๋์์จ๋ค. ๊ทธ๋ฐ๋ฐ ์ ์ ๋ฐ์ดํฐ๋ ๋ค์ด์ ์๋ค.
---
๐ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ!
์ผ๋จ 1๋ฒ,
๊ธฐ์กด์๋ ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ fetchํ๋ ํจ์(fetchUser)๋ง ์์๋๋ฐ ์ธ์ ์ ํ์ธํ๊ณ ์์ผ๋ฉด fetchUser๋ฅผ ์คํํ๋๋ก ํ๋ checkisLogin์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค. (zustand ์ฌ์ฉ)
// @/store/useUserStore.ts
export const useUserStore = create<UserState>((set) => ({
{/* user: null,*/}
isLogin: false,
{/* fetchUser, ๊ฐ์ */}
checkisLogin: async() => {
const supabase = createClient()
const {
data: { session },
error,
} = await supabase.auth.getSession()
if (error) {
console.error('Check isLogin ERROR:', error)
}
if (session) {
set({ isLogin: true })
await useUserStore.getState().fetchUser()
} else {
set({ isLogin: false })
}
},
}))
2๋ฒ ์ผ๋ฐ ๋ก๊ทธ์ธ ์ค๋ฅ์์ ๊ธฐ์กด์๋ response๋ฅผ ๋ฐ์ผ๋ฉด await fetchUser() ํด์๋๋ฐ,
๋ก๊ทธ์ธ ์ก์ ํจ์์ ๋ฐํ ๊ฐ์ ์๋ฌ๊ฐ ์์ผ๋ฉด checkisLogin()์ ์คํํ๋๋ก ๋ณ๊ฒฝํด์ ์งํํ๋ค.
if (response && response.error) {
alert('์ผ์นํ๋ ๊ณ์ ์ด ์์ต๋๋ค. ๋ค์ ์์ฑํด์ฃผ์ธ์. ')
} else {
await checkisLogin() // ์๊ฑฐ
}
- 3๋ฒ OAuth ์ค๋ฅ
์ด๊ฑด ์ฌ๋ฌ๊ฐ์ง๋ฅผ ์๋ชปํ๊ณ ์์๋ค.
- ์ผ๋จ ์ฒซ๋ฒ์งธ๋ก OAuth์ ์ก์
์ ๋ด๋นํ๋ ํ์ผ์ ๊ฒฝ๋ก์ ํ์ผ๋ช
์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ฌ์ฉํ๋ ์ .

๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ๋ ํด๋ผ์ด์ธํธ์ชฝ ์ฝ๋์์ ๋ฒํผ ํจ์์ ๋ฆฌ๋ค์ด๋ ํธ ๊ฒฝ๋ก๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผ ํ๋๋ฐ ๋นผ๋จน์ด์์๋ค.
const handleGoogleLogin = async () => {
const supabase = createClient()
const { error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
redirectTo: 'http://localhost:3000/auth/callback', // ์ด ๋ถ๋ถ์ ์ ์ฐ๊ณ ์์๊ณ , ๊ธฐ์กด์ ์ฌ์ฉํ๋ ์ก์
ํจ์๋ ๊ฒฝ๋ก๊ฐ ์๋ชป๋์ด์ ์ ์ฉ์ด ์๋๊ณ ์์๋ค
queryParams: {
access_type: 'offline',
prompt: 'consent',
},
},
})
Next.js + supabase๋ก ์์ ํ๋ ๊ฑด๋ฐ ํ์ผ์ ๊ฒฝ๋ก-ํ์ผ๋ช (/api/auth/...)๊น์ง ์ง์ผ์ผํ๋ค๋ ์๊ฐ์ ๋ชปํ๋ค.
2๋ฒ 3๋ฒ ์ค๋ฅ๋ ์ง์ง ์คํฐ๋ ๊ธฐ๊ฐ ๋ด๋ด ์ด๋์๋ถํฐ ์๋ชป๋๊ฑด์ง ๋ชจ๋ฅด๊ฒ ์ด์ ๋จธ๋ฆฌ๋ฅผ ์ธ๋งธ๋๋ฐ, ์คํฐ๋ ๋๋๊ณ ๋์๋ผ๋ ์ฐพ์๋ด์ ๋คํ์ด๋ผ๊ณ ์๊ฐํ๋ค. Next ์ฌ์ฉํ๋ฉด์ ๊ฒฝ๋ก ์ง์ ์ด๋ผ๋์ง, ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ๋ถํ๋ฉด์ ์์ฑํ๋ ๊ณผ์ ์ ํตํด ๋์ ๋ถ๋ฆฌํด์ ์๊ฐํ๋ ๋ฐฉ์์ด๋ผ๋์ง ๋ง์ด ๊ณต๋ถํ๋ค. ๊ทผ๋ฐ 15๊ฐ ๋์๋ค....
'issue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํ์๊ฐ์ ์ ์ด๋ฉ์ผ ์ธ์ฆ ๋ณด์ ์ด์ (api endpoint ๊ด๋ จ) (2) | 2024.10.16 |
|---|---|
| Git Error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 (1) | 2024.10.02 |
| Date.toISOString() ๋ก ์ธํ -9์๊ฐ ๋๋๋ฆฌ๊ธฐ (@date-fns) (0) | 2024.08.29 |
| ๋น๋ ์ค Module not found Error (Git) (0) | 2024.07.26 |
| ์์ ๋ก๊ทธ์ธ ๊ด๋ จ ์๋ฌ (OAuth flow error) (0) | 2024.07.26 |