Showing
2 changed files
with
160 additions
and
0 deletions
passport_ex/main.js
0 → 100644
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 |
-
Please register or login to post a comment