오늘 역대급으로 집중 못하고 이해도 못했다..
무기력하고 피곤하고 머리도 안돌아감 ㅠ 거의 아무것도 학습 못한 하루..
텁텁한 황사날씨때문인가... 환기도 못하고 답답해 죽겠다.
숨도 잘 안쉬어지는 느낌
어제까지는 뭔가 머리가 팽팽 돌아가서 와 나 백엔드 좋아하나? 싶었는데
passport 나오니깐 다시 진흙에 빠진 느낌...... 처음으로 돌아간 기분이다.
SHA1
// crypto모듈을 사용하여 hash 값 얻음
// sha1 말고 sha224, sha256 알고리즘도 사용 가능
const hash = crypto.createHash('sha1');
hash.update(password);
hash.digest("hex")
passport
는 다양한 로그인 방식을 구현하기 위해 strategy
라는 인터페이스를 제공const config = {
usernameField: 'email',
passwordField: 'password',
} ;
//아이디 패스워드 필드 설정 필수!
const local = new LocalStrategy(config, async (email, password, done) => {
try{
const user = await User.findOne({ email });
if (!user) {
throw new Error('회원을 찾을 수 없습니다.');
}
if (user.password !== password) {
throw new Error('비밀번호가 일치하지 않습니다.');
} // 이때, hashpassword를 사용해야 함
done (null, {
shortId: user.shortId,
email: user.email,
name: user.name,
}); // done 콜백
} catch(err) {
done(err, null);
}
})
passport.use
를 이용해 사용하도록 선언해야 함.passport.use
를 이용해 strategy를 사용하도록 선언한 후, passport.authenticate
를 사용해 해당 strategy를 이용해 요청을 처리할 수 있음const local = require('./strategies/local')
passport.use(local);
--- routes/auth.js ---
router.post('/', passport.authenticate('local');
---app.js ---
const session = require('express-session'); // express가 session을 사용할 수 있도록 선언
app.use(session({
secret: 'secret',
resave: false,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session()); // passport가 session을 사용할 수 있도록 선언해주는 부분
app.use('/auth', authRouter);
passport.serializeUser((user, callback) => {
callback(null, user);
});
passport.deserializeUser((obj, callback) => {
callback(null, obj);
})
router.get('/logout', ...{
req.logout();
res.redirect('/');
})
function loginRequired(req, res, next){
if( !req.user) {
res.redirect('/');
return;
}
next();
}
app.use('/posts', loginRequired, postsRouter);
const MongoStore =
require('connect-mongo');
app.use(session({
secret: 'SeVrEt',
resave: false.
saveUninitialized: true,
store:MongoStore.create({ mongoUrl: 'mongoUrl' ,}),
}));
author: {
type: Schema.Types.ObjectId,
ref: 'User'
required: true,
}
MongoDB에서 Document들을 가공하고, 연산하는 기능
RDBMS에서 SQL로 수행할 수 있는 기능들을 유사하게 구현할 수 있음.
ex) SQL의 GROUP BY, DISTINCT, COUNT, JOIN 등
MongoDB의 find 는 검색 필터링과 정렬 외의 기능을 제공하지 않음.
다른 Collection에서 데이터를 가져오거나, 검색된 데이터를 그룹화 하는 등의 작업이 필요한 경우 Aggregation을 통해 수행 가능
//aggregation은 Stage들의 배열로 이루어지고 각 Stage는 순차적으로 실행됨
db.posts.aggregate([
{ $group: { _id: '$author', count:{ $sum:1}}},
{ $match: {sum: {$gt: 10}}},
{ $lookup: {from:'users', localField: '_id', foreignField: '_id', as: 'users'}},
]);