TIL
authentication
너구리개발자
2024. 6. 20. 22:55
lucia, sqlite를 이용한 authentication 구현
import { Lucia } from 'lucia';
import { BetterSqlite3Adapter } from '@lucia-auth/adapter-sqlite';
import { cookies } from 'next/headers';
// 발신 응답에 포함된 쿠키에 접근할수있게 해줌
// cookies 객체는 Next.js의 서버 사이드✅ 코드에서 쿠키에 접근할 때 사용
// cf) 클라이언트 사이드에서는 cookies를 직접적으로 사용할수없음
import db from './db';
const adapter = new BetterSqlite3Adapter(db, {
user: 'users',
session: 'sessions',
});
const lucia = new Lucia(adapter, {
sessionCookie: {
expires: false,
attributes: {
secure: process.env.NODE_ENV === 'production',
// process.env.NODE_ENV: 이 환경 변수는 현재 애플리케이션의 실행 모드를 나타냅니다
// development: 개발 모드
// production: 배포 모드
// test: 테스트 모드
// secure 속성: true로 설정되면, 쿠키는 HTTPS 연결을 통해서만 전송됨
// false로 설정되면, 쿠키는 HTTP, HTTPS 모두를 통해 전송될수있다
},
},
});
export async function createAuthSession(userId) {
const session = await lucia.createSession(userId, {});
//await 키워드를 사용하면 Promise가 resolve될 때까지 기다렸다가, 그 결과값을 반환하여 JavaScript 객체로 변환
const sessionCookie = lucia.createSessionCookie(session.id);
cookies().set(
sessionCookie.name,
sessionCookie.value,
sessionCookie.attributes
);
}
//async로 선언된 함수는 항상 Promise를 반환합니다
export async function verifyAuth() {
const sessionCookie = cookies().get(lucia.sessionCookieName);
if (!sessionCookie) {
return {
user: null,
session: null,
};
}
//첫번째 if문통과하면 sessionCookie 존재
const sessionId = sessionCookie.value;
if (!sessionId) {
return {
user: null,
session: null,
};
}
// 두번째 if문까지 통과하면 sessionCookie, sessionId 모두 존재
const result = await lucia.validateSession(sessionId);
// db에서 해당 sessionID를 찾아 세션이 유효한지 확인
try {
if (result.session && result.session.fresh) {
const sessionCookie = lucia.createSessionCookie(result.session.id);
cookies().set(
sessionCookie.name,
sessionCookie.value,
sessionCookie.attributes
);
}
if (!result.session) {
const sessionCookie = lucia.createBlankSessionCookie();
cookies().set(
sessionCookie.name,
sessionCookie.value,
sessionCookie.attributes
);
// 세션을 찾지 못하는경우, 전송된 세션 쿠키를 삭제함(유효한 세션 쿠키가 아니기 때문)
}
} catch (error) {}
return result;
}