FILOT 채팅앱 만들기 - 2 (Auth)

원종서·2021년 9월 16일
0

chattingApp

목록 보기
2/4

FILOT 채팅앱 만들기 - 2 (Auth)

npm bcrypt / jsonwebtoken 를 이용한 Auth 구현.

과거 나는 회원가입, 로그인 부분이 정말 어려운지 알았다. 암호화부터 해서 유효성 등 확인해야할 것이 많다고 생각했다. 하지만 NodejS 의 유용한 패키지 덕에 크게 어렵지 않게 구현할 수 있었다. 물론 깊게 해쉬를 배우려면 어렵겠지만...


Join


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});
    }
};


Login

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});
};
  • 회원 가입과 로그인을 할때 jsonwebtoken를 이용해 id로 만든 토큰을 requset Header 부분에 넣어준다.

JWT


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();
    });
};
  • Cookie만 사용해보고 이번처음으로 token을 사용해 본 것인데, auth를 middleware로 넣어 사용하니 편리했다.

Auth 부분을 구현하면서 json 을 보내줄때 키값을 Message 와 Error를 나눠 보냈다.
그 후 프론트 하는 친구에게 키 값을 동일하게 해달라는 요청을 받았다.
프론트 쪽을 고려하지 않았던 것이고, "협업이 무엇인가?" 를 다시 한번 생각하게 되었다.

0개의 댓글