์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- heapq
- HTML
- ํ์ด์ฌ
- ๋ ธ๋ง๋์ฝ๋
- mongodb
- ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ๋ฐ
- ํ ์ดํ๋ก์ ํธ
- ๊ทธ๋ฆฌ๋
- ๋๋ฆผ์ฝ๋ฉ
- ํฌ๋กค๋ง
- node.js
- fe
- react
- ํ๋ก์ ํธ
- ์ฝ๋ฉํ ์คํธ
- ํ๋ก ํธ์๋
- ๋ฐฑ์ค
- Til
- KDT
- ๊ตญ๋น์ง์
- error
- ์ฝ๋ฉ์ ํ
- javascript
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ชจ๊ฐ์ฝ
- CSS
- ์ฝ๋ฉ
- JS
- Python
- Today
- Total
๐ฑ → ๐ณ
[node.js] passport(local ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ตฌํ) ๋ณธ๋ฌธ
๐ passport
: ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๋ค๋ฐฉ๋ฉด์ผ๋ก ๋์์ฃผ๋ ๋ชจ๋
google, facebook, github ๋ฑ ์์ ๋ก๊ทธ์ธ ๊ตฌํ์ ์ํ ๊ธฐ๋ฅ ์ ๊ณต
โ passport ์ค์น
์์ ๋ก๊ทธ์ธ์ด ์๋ local ๋ฐฉ์ ๊ตฌํ์ ์ํด passport-local๋ ๊ฐ์ด ์ค์น
npm i passport
npm i passport-local
์๋ฒ ์ฝ๋์ ๋ชจ๋ ์ถ๊ฐ(passport: ์ธ์ ์ ์ฌ์ฉ)
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
// Session
app.use(
session({
secret: 'bay',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000 * 60 * 60,
},
})
);
// Passport
app.use(passport.initialize());
app.use(passport.session());
โ passport, local ์ ๋ต ์ค์
- passport๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก๊ทธ์ธ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ง ๋ฏธ๋ฆฌ ์ ํด๋์
- ์ค์ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ passport.authenticate ๋ฉ์๋ ์ด์ฉํ์ฌ ์ฒ๋ฆฌ
- ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ด๋ค ํค ๊ฐ์ผ๋ก ๋ฐ์์ง ์ค์
- ์ธ์ฆ ์ ์ฐจ ์ํํ๋ ํจ์ ์ค์
- ์ธ์ฆ ์ ์ฐจ ์ํ์ ๊ฒฐ๊ณผ๋ callback์ ๋ด์์ ์ฒ๋ฆฌ
id, pw๋ก ์ฌ์ฉํ ํค ๊ฐ ์ค์
new LocalStrategy(
{
usernameField: 'id',
passwordField: 'password',
},
์ค์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ ๋ถ๋ถ
async (id, password, cb) => {
// ์๋ฒ์ ์ ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ฌ id ๊ฐ ์๋์ง ํ์ธ
const client = await mongoClient.connect();
const userCursor = client.db('db๋ช
').collection('users');
const idResult = await userCursor.findOne({ id });
// id๊ฐ ์กด์ฌํ๋ฉด ๋น๋ฐ๋ฒํธ ๊น์ง ์๋์ง ํ์ธํ๊ธฐ
if (idResult !== null) {
const result = await userCursor.findOne({
id,
password,
});
// ๋น๋ฐ๋ฒํธ ๊น์ง ์ผ์นํ๋ฉด ์ฝ๋ฐฑ ํจ์์ ์ฐพ์ ์ ์ ์ ๋ณด๋ฅผ ์ ๋ฌ
if (result !== null) {
cb(null, result);
} else {
// ๊ฐ๊ฐ ์ํฉ์ ๋ง๋ ์๋ฌ ๋ฉ์ธ์ง ์ ๋ฌ
cb(null, false, { message: '๋น๋ฐ๋ฒํธ๊ฐ ๋ค๋ฆ
๋๋ค.' });
}
} else {
cb(null, false, { message: 'ํด๋น id ๊ฐ ์์ต๋๋ค.' });
}
}
์ ์ฒด ์ฝ๋
passport.use(
new LocalStrategy(
{
usernameField: 'id',
passwordField: 'password',
},
async (id, password, cb) => {
const client = await mongoClient.connect();
const userCursor = client.db('kdt1').collection('users');
const idResult = await userCursor.findOne({ id });
if (idResult !== null) {
const result = await userCursor.findOne({
id,
password,
});
if (result !== null) {
cb(null, result);
} else {
cb(null, false, { message: '๋น๋ฐ๋ฒํธ๊ฐ ๋ค๋ฆ
๋๋ค.' });
}
} else {
cb(null, false, { message: 'ํด๋น id ๊ฐ ์์ต๋๋ค.' });
}
}
)
);
โ passport, serialzeUser
- passport๋ session์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ ์ฌ๋ถ ํ๋จ
- ์ ์ฝ๋์์ callbackํจ์์ ๋ด๊ธด ๋ด์ฉ์ serialzeUser ๋ฉ์๋๊ฐ ๋ฐ์์ ์ธ์ ์ ๋ง๋ค์ด ์ ๋ฌ ๋ฐ์ ์ ์ ์ ๋ณด๋ฅผ ์ธ์ ์ ์ ์ฅ
- ํด๋น ์ธ์ ์ req.user๋ก ์ ๊ทผํ์ฌ ์ ๋ณด ํ์ธ ๊ฐ๋ฅ
- ์ฝ๋ฐฑ ํจ์์ ์ํด user.id ๋ถ๋ถ์ด ์ธ์ ์ ์ ์ฅ๋๋ ์ฝ๋
passport.serializeUser((user, cb) => {
cb(null, user.id);
});
โ passport, deserializeUser
- passport๋ ๋ ๊น๋ค๋กญ๊ฒ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํ์ด์ง์ ์ ์ํ๋ ค๊ณ ํ ๋์๋ ๊ณ์ ์ธ์ฆ์ ์๊ตฌ
- ํด๋น ๊ธฐ๋ฅ์ deserializeUser๊ฐ ์ํ
- session์ ์ ์ฅ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํตํด์ db์ ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์๋์ง ๊พธ์คํ ํ์ธํ๋ ๊ณผ์ ๊ฑฐ์นจ
passport.deserializeUser(async (id, cb) => {
const client = await mongoClient.connect();
const userCursor = client.db('db๋ช
').collection('users');
const result = await userCursor.findOne({ id });
if (result) cb(null, result);
});
๐
session -> ๋ก๊ทธ์ธ์ด ๋๋ฉด ์ดํ๋ ๊ณ์ ๋ฏฟ๊ณ ๊ฐ
passport -> ๋ก๊ทธ์ธ์ด ๋์ด ์๋์ง ๊พธ์คํ ์ฒดํฌ ๋ฐ ์ ์ ํ์ธ
โ passport ๋ก๊ทธ์ธ
passport.authenticate ๋ฉ์๋๊ฐ ์ฒ๋ฆฌ
passport.authenticate('local', (err, user, info) => {
์๋ฌ ๋ฐ์ ์ : err ๋งค๊ฐ๋ณ์์ ์๋ฌ ๊ฐ์ด ๋ด๊น
๋ก๊ทธ์ธ ์ฑ๊ณต ์: user์ ์ ๋ฌํ user ์ ๋ณด๊ฐ ๋ด๊ฒจ์ ๋์ด์ด
๋ก๊ทธ์ธ ์คํจ ์: user์ null๋ก ๋ฆฌํด๋๋ฉฐ, ์ ๋ฌํ ๋ฉ์์ง๋ info ๋งค๊ฐ๋ณ์์ ๊ฐ์ฒด์ ๋ด๊ฒจ์ ์ ๋ฌ๋จ
router.post('/', (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
if (err) next(err);
if (!user) {
return res.send(
`${info.message}<br><a href="/login">๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋</a>`
);
}
req.logIn(user, (err) => {
if (err) next(err);
res.redirect('/board');
});
})(req, res, next);
});
โ passport ๋ก๊ทธ์์
req.logout ๋ฉ์๋ ์ฌ์ฉ
router.get('/logout', (req, res, next) => {
req.logout((err) => {
if (err) {
return next(err);
}
return res.redirect('/');
});
});
โ ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ฅธ ๊ฒ์ํ ์๋น์ค ๋ณ๊ฒฝ
passport์ ์ํด login๋ ์ ์ session์ req.user์ ๋ด๊ธฐ๊ฒ ๋๋ฏ๋ก isLogin ํจ์์ ์กฐ๊ฑด ์ถ๊ฐ
function isLogin(req, res, next) {
if (req.session.login || req.user) {
next();
} else {
res.send('๋ก๊ทธ์ธ ํด์ฃผ์ธ์.<br><a href="/login">๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋</a>');
}
}
ํ์ ์์ด๋ ๊ฐ์ด req.session.userId๋ฟ๋ง์๋๋ผ, req.user.id๋ ์๊ฒผ์ผ๋ฏ๋ก ํด๋น ๋ถ๋ถ๋ ์์
๊ฒ์ํ ๋ ๋๋ง ๋ถ๋ถ ์์
// ๊ฒ์ํ ์ฒ์ ๋ ๋๋ง ํ ๋
router.get('/', isLogin, async (req, res) => {
const client = await mongoClient.connect();
const cursor = client.db('kdt1').collection('board');
const ARTICLE = await cursor.find({}).toArray();
const articleLen = ARTICLE.length;
res.render('board', {
ARTICLE,
articleCounts: articleLen,
userId: req.session.userId ? req.session.userId : req.user.id,
});
});
๊ฒ์ํ ๊ธ์ฐ๊ธฐ ๋ถ๋ถ ์์
router.post('/', isLogin, async (req, res) => {
if (req.body) {
if (req.body.title && req.body.content) {
const newArticle = {
id: req.session.userId ? req.session.userId : req.user.id,
title: req.body.title,
content: req.body.content,
};
const client = await mongoClient.connect();
const cursor = client.db('kdt1').collection('board');
await cursor.insertOne(newArticle);
res.redirect('/board');
} else {
const err = new Error('์์ฒญ ์ด์');
err.statusCode = 404;
throw err;
}
} else {
const err = new Error('์์ฒญ์ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค');
err.statusCode = 404;
throw err;
}
});
๐๐ป ์๋ฒ ์ฝ๋ ์ ๋ฆฌ (LocalStrategy ๋ชจ๋ํ)
localStratege.js ํ์ผ ์์ฑ
-> passport, LocalStrategy ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
-> module.exports๋ฅผ ํ๋์ ์ต๋ช ํจ์๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌ
-> serialzeUser, deserialzeUser ๋ ๊ฐ์ด ๋ฌถ์ด์ ์ฒ๋ฆฌ
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const verifyModule = require('./register').verifyPassword;
const mongoClient = require('./mongo');
// ์ต๋ช
ํจ์ ์ ๋ฌ
module.exports = () => {
passport.use(
new LocalStrategy(
{
usernameField: 'id',
passwordField: 'password',
},
async (id, password, cb) => {
const client = await mongoClient.connect();
const userCursor = client.db('node1').collection('users');
// {id : id} = {id}
const idResult = await userCursor.findOne({ id });
// console.log(idResult);
if (idResult !== null) {
if (idResult.salt !== undefined) {
const pwResult = verifyModule(
password,
idResult.salt,
idResult.password
);
if (pwResult) {
cb(null, idResult);
} else {
cb(null, false, { message: '๋น๋ฐ๋ฒํธ๊ฐ ํ๋ ธ์ต๋๋ค.' });
}
} else if (idResult.password === password) {
cb(null, idResult);
} else {
cb(null, false, { message: '๋น๋ฐ๋ฒํธ๊ฐ ํ๋ ธ์ต๋๋ค.' });
}
} else {
cb(null, false, { message: 'ํด๋น id๊ฐ ์์ต๋๋ค.' });
}
}
)
);
// idResult -> user
passport.serializeUser((user, cb) => {
cb(null, user.id);
});
// ํต์ ์ ํด์ผํ๋๊น async์ฌ์ฉ
passport.deserializeUser(async (id, cb) => {
const client = await mongoClient.connect();
const userCursor = client.db('node1').collection('users');
const result = await userCursor.findOne({ id });
if (result !== null) cb(null, result);
});
๋ฉ์ธ ์๋ฒ ์์
const localStrategy = require('./routes/localStrategy’);
localStrategy();
'Server > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[node.js] Session์ผ๋ก ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ (0) | 2022.09.24 |
---|---|
[node.js] Cookie - ํ์ ์ฐฝ ํ๋ฃจ๋์ ๋ณด์ง ์๊ธฐ (0) | 2022.09.24 |
[node.js] Front์์ Back์ผ๋ก ๋ฐ์ดํฐ ์ ์ก (0) | 2022.09.24 |
[node.js] Error Handling (1) | 2022.09.24 |
[node.js] View Engine(ejs, pug, nunjucks) (0) | 2022.09.24 |