강희주

Merge branch 'feature/signUp'

1 +// 사용 전 npm 설치
2 +// npm install express express-session session-file-store passport passport-local
3 +
4 +const express = require('express');
5 +const session = require('express-session');
6 +const passport = require('passport'), LocalStrategy = require('passport-local').Strategy;
7 +
8 +const fileStore = require('session-file-store')(session);
9 +const app = express();
10 +
11 +//미들웨어 리스트
12 +app.use(express.urlencoded({extended:false}));
13 +app.use(session({
14 + secret: 'secret key',
15 + resave: false,
16 + saveUninitialized: false,
17 + store : new fileStore()
18 + }));
19 +app.use(passport.initialize());
20 +app.use(passport.session());
21 +
22 +//사용자 정보 session 읽기, 쓰기
23 +passport.serializeUser(function(user, done) { //쓰기
24 + done(null, user.email);
25 +});
26 +
27 +passport.deserializeUser(function(id, done) { //읽기
28 + done(null, id);
29 +});
30 +
31 +//메인 페이지
32 +app.get('/',(req,res)=>{
33 + let page = getPage('Passport','example page(수정하시기 바랍니다)',authInfo(req));
34 + res.send(page);
35 +});
36 +
37 +//로그인 페이지
38 +app.get('/login',(req,res)=>{
39 + let page = getPage('로그인',`
40 + <form action="/login" method="post">
41 + <input type="text" name="email" placeholder="email"><br>
42 + <input type="password" name="password" placeholder="****"><br>
43 + <div style="display : flex;justify-content:space-between;width: 153px;">
44 + <input type="submit" value="로그인" style="display:inline-block;">
45 + <a href="/join" style="background : #E5E5E5;padding : 2px; border: 0.5px solid black;cursor:pointer;border-radius:3px;font-size:13px;color:black;text-decoration:none;">회원가입</a>
46 + </div>
47 + </form>
48 + `,`<a href="/">뒤로가기</a>`);
49 + res.send(page);
50 +});
51 +
52 +//로그인 인증 (Passport)
53 +passport.use(new LocalStrategy({
54 + //로그인 페이지 input 태그 내 name
55 + usernameField: 'email',
56 + passwordField: 'password'
57 + },
58 + (id, password, done)=>{
59 + console.log(id,password);
60 + //회원 정보가 한개이상 있을때
61 + if(user){
62 + console.log(user);
63 +
64 + //아이디가 다를때
65 + if (id !== user.email)
66 + return done(null, false, { message: '아이디가 다르다' });
67 + //비밀번호가 다를때
68 + else if (password !== user.password)
69 + return done(null, false, { message: '비번이 다르다' });
70 + //아이디, 비밀번호 모두 맞을 경우
71 + return done(null, user);
72 + }
73 +}));
74 +
75 +//로그인 처리 (Passport)
76 +app.post('/login',
77 +passport.authenticate('local', {
78 + //성공시, 메인페이지 이동
79 + //실패시 로그인 페이지 이동
80 + successRedirect: '/',
81 + failureRedirect: '/login'
82 +}));
83 +
84 +
85 +//회원가입 페이지 Get
86 +app.get('/join',(req,res)=>{
87 + let page = getPage('회원가입',`
88 + <form action="/join" method="post">
89 + <input type="email" name="email" placeholder="email"><br>
90 + <input type="password" name="password" placeholder="****"><br>
91 + <input type="name" name="name" placeholder="이름"><br>
92 + <input type="submit" value="회원가입"><br>
93 + </form>
94 + `,'<a href="/login">뒤로가기</a>');
95 + res.send(page);
96 +});
97 +
98 +//회원가입 처리 Post : 예제를 위해 간단 저장 방식으로 구현
99 +var user = {};
100 +app.post('/join',(req,res)=>{
101 + user.email = req.body.email;
102 + user.password = req.body.password;
103 + user.name=req.body.name;
104 + //로그인 페이지로 이동
105 + res.redirect('/login');
106 +});
107 +
108 +//로그 아웃 처리
109 +app.get('/logout',(req,res)=>{
110 + //passport 정보 삭제
111 + req.logout();
112 + //서버측 세션 삭제
113 + req.session.destroy(()=>{
114 + //클라이언트 측 세션 암호화 쿠키 삭제
115 + res.cookie('connect.sid','',{maxAge:0});
116 + res.redirect('/');
117 + });
118 +});
119 +
120 +
121 +//포트 연결
122 +app.listen(3000,()=>console.log(`http://localhost:3000`));
123 +
124 +
125 +//로그인 로그아웃 여부
126 +const authInfo = (req)=>{
127 + if(req.user) return `${user.name} | <a href="/logout">로그아웃</a>`;
128 + return `<a href="/login">login</a>`;
129 +}
130 +
131 +//페이지 템플릿
132 +const getPage = (title, content, auth) =>{
133 + return `
134 + <!DOCTYPE html>
135 + <html lang="en">
136 + <head>
137 + <meta charset="UTF-8">
138 + <meta http-equiv="X-UA-Compatible" content="IE=edge">
139 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
140 + <title>Passport Example</title>
141 + </head>
142 + <body>
143 + ${auth}
144 + <h1>${title}</h1>
145 + <p>${content}</p>
146 + </body>
147 + </html>
148 + `;
149 +}
...\ No newline at end of file ...\ No newline at end of file
1 +{
2 + "name": "passport_ex",
3 + "version": "1.0.0",
4 + "description": "",
5 + "main": "main.js",
6 + "scripts": {
7 + "test": "echo \"Error: no test specified\" && exit 1"
8 + },
9 + "author": "",
10 + "license": "ISC"
11 +}