과거 나는 회원가입, 로그인 부분이 정말 어려운지 알았다. 암호화부터 해서 유효성 등 확인해야할 것이 많다고 생각했다. 하지만 NodejS 의 유용한 패키지 덕에 크게 어렵지 않게 구현할 수 있었다. 물론 깊게 해쉬를 배우려면 어렵겠지만...
const join = async (req, res) => {
const {username, password, confirmpassword, name, phone_number} = req.body;
if (password != confirmpassword) {
return res.status(409).json({message: "비밀번호가 틀립니다"});
}
const existingUser = await User.exists({id: username});
if (existingUser) {
return res
.status(409)
.json({message: "아이디 혹은 닉넴이이 이미 사용중입니다."});
}
const newPassword = await bcrypt.hash(password, config.bcrypt.salt);
try {
const user = await User.create({
id: username,
password: newPassword,
name,
phone_number,
});
const token =jwt.sign(user.id, config.jwt.secretKey, {
expiresIn: config.jwt.expireInSec,
});
return res.status(200).json(token);
} catch (error) {
console.error(error);
res.json({message: error});
}
};
const login = async (req, res, next) => {
const {username, password} = req.body;
const user = await User.findOne({id: username});
if (!user) {
return res.status(401).json({message: "없는 아이디입니다."});
}
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.status(401).json({message: "비밀번호가 틀려요."});
}
const token = createJwt(user.id);
req.headers.token = token;
return res.json({token});
};
const auth = async (req, res, next) => {
const token = req.get("token");
if (!token) {
return res.status(401).json(AUTH_ERROR);
}
jwt.verify(token, config.jwt.secretKey, async (error, decoded) => {
if (error) {
return res.status(401).json(AUTH_ERROR);
}
const user = await User.findOne({id: decoded.id});
if (!user) {
return res.status(401).json(AUTH_ERROR);
}
req.id = user.id;
next();
});
};
Auth 부분을 구현하면서 json 을 보내줄때 키값을 Message 와 Error를 나눠 보냈다.
그 후 프론트 하는 친구에게 키 값을 동일하게 해달라는 요청을 받았다.
프론트 쪽을 고려하지 않았던 것이고, "협업이 무엇인가?" 를 다시 한번 생각하게 되었다.