Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions libs/middlewares/authMiddleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { NextRequest, NextFetchEvent, NextResponse } from "next/server";
import jwt from "jsonwebtoken"
import 'dotenv/config'

const secret_key = process.env.SECRET_KEY || "";
export async function middleware(
req: NextRequest,
ev: NextFetchEvent,
){
try {
if(req.cookies.has('accessToken')){
const accessToken = req.cookies.get('accessToken');
if(accessToken !== undefined){
jwt.verify(accessToken, secret_key, (err, decoded) => {
if(err){
return new Response(
JSON.stringify({err}),
{ status: 401 },
);
};
return NextResponse.next();
})
}else{
return new Response(
JSON.stringify({"message":"로그인이 필요한 기능입니다."}),
{ status: 401 },
);
}
}
} catch (error:any) {
return new Response(
JSON.stringify({error}),
{ status: 401 },
);
}


}
45 changes: 45 additions & 0 deletions libs/middlewares/authWithRefreshToken.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { NextRequest, NextFetchEvent, NextResponse } from "next/server";
// import { setCookie } from '../../utils/cookies'
import client from "../client";
import jwt from "jsonwebtoken"
import 'dotenv/config'

const secret_key = process.env.SECRET_KEY || "";

let userId: string | object | Buffer;

export const authNoRefreshToken = async (
req: NextRequest,
ev: NextFetchEvent,
) => {
try {
if(req.cookies.has('refreshToken')){
const refreshToken = req.cookies.get('refreshToken');
if(refreshToken !== undefined){
const identifier = jwt.verify(refreshToken, secret_key);

if(!identifier){
throw new Error("토큰이 존재하지 않습니다.");
};

const user = await client.user.findUnique({where:{identifier}});
if(user == null){
throw new Error("토큰이 유효하지 않습니다. 다시 로그인해 주십시오.");
};

if(user?.refreshToken !== refreshToken){
throw new Error("서버에 저장된 토큰 정보와 일치하지 않습니다. 다시 로그인해 주십시오.");
};

const response = NextResponse.next();
response.cookies.set('accessToken', jwt.sign(userId, secret_key, {expiresIn: '1h'})); // body에 담아주도록 수정

return response;
}
}else{
throw new Error("토큰이 존재하지 않습니다.");
}
} catch (error:any) {
throw new Error(error)
}
}
32 changes: 32 additions & 0 deletions libs/middlewares/isLogin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { NextRequest, NextFetchEvent, NextResponse } from "next/server";
import client from "../client";
import jwt from "jsonwebtoken"
// import cookies from 'next-cookies';

import 'dotenv/config'
const secret_key = process.env.SECRET_KEY || "";

export function middleware(
req: NextRequest,
ev: NextFetchEvent,
) {
try {
if(!req.cookies.has('accessToken')){
return NextResponse.rewrite(new URL('/login', req.url));
} else {
return new Response(
JSON.stringify({"message": "이미 로그인된 상태입니다."}),
{ status: 401 },
)
}
} catch (error) {
return new Response(
JSON.stringify({error}),
{ status: 400 },
)
}
}

export const config = {
matcher: ['/api/user/login', '/api/user/signup']
}
29 changes: 29 additions & 0 deletions libs/middlewares/validation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { NextRequest, NextFetchEvent, NextResponse } from "next/server";
import Joi from "joi";

export function joiValidation(
req: NextRequest,
ev: NextFetchEvent,
) {
const emailRegExp = /[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]$/i;
const passwordRegExp = /(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])/i;
const schema = Joi.object().keys({
email: Joi.string().regex(emailRegExp).email(),
password: Joi.string().regex(passwordRegExp)
});
try {
schema.validate(req.body)
} catch (error) {
return new Response(
JSON.stringify({error}),
{ status: 400 },
)
}

return NextResponse.rewrite(new URL('/home', req.nextUrl)); // 경로 수정 필요

}
export const config = {
matcher: ['/api/user/signup']
}

Loading