From 89230ce14ee124fee59292008b566f8134dcc496 Mon Sep 17 00:00:00 2001 From: Harpreet Singh Date: Mon, 26 Feb 2024 10:13:45 +0530 Subject: [PATCH] FEAT:single session/login --- .env.example | 2 ++ src/app/api/user/route.ts | 15 +++++++++++++++ src/app/invalidsession/page.tsx | 16 ++++++++++++++++ src/lib/auth.ts | 5 +++-- src/middleware.ts | 21 +++++++++++++++++++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/app/api/user/route.ts create mode 100644 src/app/invalidsession/page.tsx create mode 100644 src/middleware.ts diff --git a/.env.example b/.env.example index 0ffe7de6..1bc317ab 100644 --- a/.env.example +++ b/.env.example @@ -14,3 +14,5 @@ BOT_TOKEN = "123" GUILD_ID = "123" LOCAL_CMS_PROVIDER = true CACHE_EXPIRE_S = 10 +JWT_SECRET_TOKEN="JWT_SECRET_TOKEN" + diff --git a/src/app/api/user/route.ts b/src/app/api/user/route.ts new file mode 100644 index 00000000..22e8cc26 --- /dev/null +++ b/src/app/api/user/route.ts @@ -0,0 +1,15 @@ +import { type NextRequest, NextResponse } from 'next/server'; +import db from '@/db'; + +export async function GET(req: NextRequest) { + const url = new URL(req.url); + const token = url.searchParams.get('token'); + const user = await db.user.findFirst({ + where: { + token, + }, + }); + return NextResponse.json({ + user, + }); +} diff --git a/src/app/invalidsession/page.tsx b/src/app/invalidsession/page.tsx new file mode 100644 index 00000000..0fdbaddf --- /dev/null +++ b/src/app/invalidsession/page.tsx @@ -0,0 +1,16 @@ +'use client'; + +import { signOut } from 'next-auth/react'; +import React, { useEffect } from 'react'; + +const page = () => { + useEffect(() => { + signOut({ + callbackUrl: '/signin', + }); + }, []); + + return
page
; +}; + +export default page; diff --git a/src/lib/auth.ts b/src/lib/auth.ts index e2e960c2..f5622c0b 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -129,16 +129,17 @@ export const authOptions = { secret: process.env.NEXTAUTH_SECRET || 'secr3t', callbacks: { session: async ({ session, token }: any) => { - console.log('session', session, token); if (session?.user) { session.user.id = token.uid; - session.user.authToken = token; + session.user.jwtToken = token.jwtToken; } + return session; }, jwt: async ({ user, token }: any) => { if (user) { token.uid = user.id; + token.jwtToken = user.token; } return token; }, diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 00000000..605cbcea --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,21 @@ +import { withAuth } from 'next-auth/middleware'; +import { NextResponse } from 'next/server'; + +export const config = { + matcher: ['/courses/:path*'], +}; + +export default withAuth(async (req) => { + const token = req.nextauth.token; + if (!token) { + return NextResponse.redirect(new URL('/invalidsession', req.url)); + } + const user = await fetch( + `${process.env.NEXT_PUBLIC_BASE_URL_LOCAL}/api/user?token=${token.jwtToken}`, + ); + + const json = await user.json(); + if (!json.user) { + return NextResponse.redirect(new URL('/invalidsession', req.url)); + } +});