feat: 세션 관리 및 로그인 후 사용자 홈 화면 구현 (Phase 2 완료)
- express-session을 이용한 로그인 상태 유지 구현 - 인증 성공 시 /home.html 리디렉션 및 정보 표시 기능 추가 - 로그아웃 기능 구현 - UI 흐름 개선: 로그인 성공 시 홈 화면으로 자동 이동
This commit is contained in:
36
server.js
36
server.js
@@ -1,5 +1,6 @@
|
||||
require('dotenv').config();
|
||||
const express = require('express');
|
||||
const session = require('express-session');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { generateKeyPair, exportJWK } = require('jose');
|
||||
@@ -9,8 +10,23 @@ const app = express();
|
||||
const PORT = process.env.PORT || 3000;
|
||||
|
||||
app.use(express.json());
|
||||
app.use(session({
|
||||
secret: 'headless-demo-secret-key',
|
||||
resave: false,
|
||||
saveUninitialized: true,
|
||||
cookie: { secure: false } // 개발 환경이므로 false
|
||||
}));
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
// 인증 체크 미들웨어
|
||||
const isAuthenticated = (req, res, next) => {
|
||||
if (req.session.user) {
|
||||
next();
|
||||
} else {
|
||||
res.status(401).json({ success: false, message: '인증이 필요합니다.' });
|
||||
}
|
||||
};
|
||||
|
||||
let jwks;
|
||||
let oidcClient;
|
||||
|
||||
@@ -75,12 +91,17 @@ app.post('/api/login', async (req, res) => {
|
||||
await delay(1200);
|
||||
|
||||
if (loginId && password) {
|
||||
const userData = { id: loginId, name: '사용자(SSO)', loginTime: new Date().toISOString() };
|
||||
console.log(`[OIDC Success] ID Token received and verified using SSO public keys.`);
|
||||
|
||||
// 세션에 저장
|
||||
req.session.user = userData;
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'SSO(OIDC) 인증 성공',
|
||||
user: { id: loginId, name: '사용자(SSO)' },
|
||||
redirectTo: '/home'
|
||||
user: userData,
|
||||
redirectTo: '/home.html'
|
||||
});
|
||||
} else {
|
||||
res.status(401).json({ success: false, message: 'SSO 인증 실패: 아이디 또는 비밀번호를 확인해주세요.' });
|
||||
@@ -113,6 +134,17 @@ app.post('/api/send-link', async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// 내 정보 확인 API
|
||||
app.get('/api/me', isAuthenticated, (req, res) => {
|
||||
res.json({ success: true, user: req.session.user });
|
||||
});
|
||||
|
||||
// 로그아웃 API
|
||||
app.post('/api/logout', (req, res) => {
|
||||
req.session.destroy();
|
||||
res.json({ success: true, message: '로그아웃 되었습니다.' });
|
||||
});
|
||||
|
||||
// OIDC Callback (모바일 앱 리디렉션 등 처리용)
|
||||
app.get('/callback', (req, res) => {
|
||||
const params = oidcClient.callbackParams(req);
|
||||
|
||||
Reference in New Issue
Block a user