인프런 커뮤니티 질문&답변

villena님의 프로필 이미지
villena

작성한 질문수

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의

auth에서 x_auth를 가져오지 못하는 문제

해결된 질문

작성

·

403

0

사진과 같이 cookies로부터 x_auth를 가져오지 못하는 문제가 발생합니다.

console.log(req)를 출력해보니 headers에 cookie 밑에 x_auth가 있는 형태로 보여서

아래 사진처럼 let token = req.headers.cookie.x_auth로 수정해주고 postman을 실행해보았는데요

다음과 같이 토큰이 db와 일치하는데도 에러가 발생했습니다.

어디를 수정해야할지 도저히 모르겠어서 질문 드립니다.

auth.js

const { User } = require("../models/users");

let auth = (req, res, next) => {
    // 인증 처리 하는 곳

    // 클라이언트 쿠키에서 토큰을 가져온다.
    let token = req.cookies.x_auth;


    // 토큰을 복호화한 후 유저를 찾는다.
    User.findByToken(token, (err, user) => {
        if(errthrow err;
        if(!userreturn res.json({ isAuthfalseerrortrue})
        // req.token과 req.user에 값을 넣어주는건 이렇게 해두면 index.js의 app.get으로 req정보가 넘어올 수 있음
        req.token = token;
        req.user = user;
        // next를 사용해야 app.get의 두번째 인자인 auth에서 다음 실행으로 넘어갈 수 잇게 됨
        next();
    })
    // 유저가 있으면 인증 오케이
    // 유저가 없으면 인증 ㄴㄴ
}

// 다른 모듈에서도 사용할 수 있게 처리
module.exports = { auth };

users.js

// MongoDB Model and Schema

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const saltRounds = 10;
const jwt = require('jsonwebtoken');


const userSchema = mongoose.Schema({
    name: {
        typeString,
        maxlength50
    },
    email: {
        typeString,
        trimtrue,
        unique1
    },
    password: {
       typeString,
       minlength5,
       maxlength100
    },
    lastname: {
        typeString,
        maxlength50
    },
    role: {
        typeString,
        default0
    },
    imageString,
    token: {
        typeString
    },
    tokenExp: {
        typeNumber
    }
})

userSchema.pre('save'function(next) {
    var user = this;
    if(user.isModified('password')) {
    // 비밀번호를 save되기 전에 암호화시킨다
        bcrypt.genSalt(saltRoundsfunction(err, salt) {
            if(errreturn next(err)
            // hash는 암호화된 비밀번호.. user.password를 암호화 하면 콜백함수에서 그걸 가져올때 hash를 사용
            bcrypt.hash(user.passwordsaltfunction(err, hash) {
                if(errreturn next(err);
                user.password = hash;
                next();
            });
        });
    } else {
        next()
    }
})

userSchema.methods.comparePassword = function(plainPassword, cb) {
    // plainPassword dsgesdw 암호화된 비밀번호 $2b$10$jLkT6X2XDLVJkR33reQuRe6/lcpyg/nis7cREwAlMKDq8P9rvRZFa
    bcrypt.compare(plainPasswordthis.passwordfunction(err, isMatch) {
        console.log(plainPassword)
        console.log(this.password)
        if(errreturn cb(err);
        cb(nullisMatch);
    })
}

userSchema.methods.generateToken = function(cb) {
    var user = this;
    // jsonwebtoken을 이용해서 token을 생성하기
    var token = jwt.sign(user._id.toHexString(), 'secretToken')

    // user._id + 'secretToken' = token
    // secretToken으로 user._id를 얻음
    user.token = token
    user.save(function(err, user) {
        if(errreturn cb(err);
        cb(nulluser);
    })
}

    userSchema.statics.findByToken = function(token, cb) {
        var user = this;
        // user._id + ' ' = token
        jwt.verify(token'secretToken'function(err, decoded) {
            // 유저 아이디를 이용해서 유저를 찾은 다음에
            // 클라이언트에서 가져온 token과 db에 보관된 토큰이 일치하는지 확인

            user.findOne( { "_id"decoded"token"token } , function (err, user) {
                if(errreturn cb(err);
                cb(nulluser);
            })
        })
    }

const User = mongoose.model('User'userSchema);
module.exports = {User}

도와주시면 감사하겠습니다ㅠㅠ

답변 4

0

villena님의 프로필 이미지
villena
질문자

답변이 달린줄 몰랐는데 이거 app.use로 쿠키파서 사용하는 부분을 빠뜨렸던 게 문제였습니다!ㅠㅠ 도와주셔서 감사합니다ㅎㅎ

0

John Ahn님의 프로필 이미지
John Ahn
지식공유자

혹시  proxy 안쓰시고  cors 이용해서 직접 통신하고 계신가요 ~ ??   

안녕하세요! 저도 같은 문제로 고민하고 있었는데 이 질문을 발견해서 답글 달아요!! proxy 안쓰고 cors를 이용해서 직접 통신하고 있는데 이럴때는 다르게 해주어야하나요??? 답변 주시면 정말 감사하겠습니다!!!

0

villena님의 프로필 이미지
villena
질문자

그렇게도 해봤는데 오류가 났습니다ㅜㅜ

0

John Ahn님의 프로필 이미지
John Ahn
지식공유자

안녕하세요 ~ 

쿠키 가져오실떄 

let token = req.cookies.x_auth;

이런식으로 가져와 보시겠어요 ~ ?

villena님의 프로필 이미지
villena

작성한 질문수

질문하기