NODE.JS
아마존 E-commerce 클론 -11) sign in 기능 만들기(백엔드)
dodop
2021. 5. 27. 19:18
우선 user router를 작성한다.
여기서 generateToken은 나중에 jsonwebtoken을 이용해서 authentification할 것이다.
import express from 'express';
import data from '../data.js';
import User from '../models/userModel.js'
import bcrypt from 'bcryptjs';
import expressAsyncHandler from 'express-async-handler'
const userRouter = express.Router();
userRouter.post('/signin', expressAsyncHandler(async (req, res)=>{
const user = await User.findOne({email:req.body.email});
if(user){
if(bcrypt.compareSync(req.body.password, user.password)){
res.send({
_id:user.id,
name:user.name,
email:user.email,
isAdmin:user.isAdmin,
token:generateToken(user)
});
return ;
}
}
res.status(401).send({message:"Invalid email or password"})
}))
export default userRouter;
npm install jsonwebtoken해준다.
backend 폴더안에 utils.js파일을 만들어준다.
여기에 토큰을 발생시키는 generateToken을 만들어준다.
우리는 토큰을 만들때 secret코드를 합쳐서 안전하게 토큰을 보호하는데,
이를 안전한 곳에 보호하기 위해서 .env라는 파일을 최상위 디렉토리에 만들어주고 시크릿키 정보를 넣어줄 것이다.
또 이 .env파일을 사용하기 위해서 npm install dotenv를 해준다.
utils.js
import jwt from 'jsonwebtoken';
export const generateToken = (user)=>{
return jwt.sign({
_id:user._id,
name:user.name,
email:user.email,
isAdmin: user.isAdmin
}, process.env.JWT_SECRET, {
expiresIn: '30d'
})
}
.env(이파일은 .gitignore에 포함되어야한다)
JWT_SECRET = somethingsecret
server.js
import dotenv from 'dotenv';
dotenv.config();
userRouter.js에 utils파일을 임포트해준다.
import { generateToken } from '../utils.js';
지금은 프론트엔드가 없어서 포스트맨을 이용한다.
여기서 오류가 발생하는 이유는 우리가 json으로 보낸 데이터를 제대로 못받아서이다.
server.js파일에 다음과 같이 추가해주자(bodyparser처럼 작동)
app.use(express.json());
app.use(express.urlencoded({extended:true}))
이번에는 데이터를 잘 받고 토큰도 잘 생성했다.
마지막으로 utils.js를다음과같이 변경해서 만약 process.env.~이 존재한다면(production mode) 잘 작동하도록 변경해주자.
import jwt from 'jsonwebtoken';
export const generateToken = (user)=>{
return jwt.sign({
_id:user._id,
name:user.name,
email:user.email,
isAdmin: user.isAdmin
}, process.env.JWT_SECRET || 'somethingsecret', {
expiresIn: '30d'
})
}