사진과 같이 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(err) throw err;
if(!user) return res.json({ isAuth: false, error: true})
// 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: {
type: String,
maxlength: 50
},
email: {
type: String,
trim: true,
unique: 1
},
password: {
type: String,
minlength: 5,
maxlength: 100
},
lastname: {
type: String,
maxlength: 50
},
role: {
type: String,
default: 0
},
image: String,
token: {
type: String
},
tokenExp: {
type: Number
}
})
userSchema.pre('save', function(next) {
var user = this;
if(user.isModified('password')) {
// 비밀번호를 save되기 전에 암호화시킨다
bcrypt.genSalt(saltRounds, function(err, salt) {
if(err) return next(err)
// hash는 암호화된 비밀번호.. user.password를 암호화 하면 콜백함수에서 그걸 가져올때 hash를 사용
bcrypt.hash(user.password, salt, function(err, hash) {
if(err) return next(err);
user.password = hash;
next();
});
});
} else {
next()
}
})
userSchema.methods.comparePassword = function(plainPassword, cb) {
// plainPassword dsgesdw 암호화된 비밀번호 $2b$10$jLkT6X2XDLVJkR33reQuRe6/lcpyg/nis7cREwAlMKDq8P9rvRZFa
bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
console.log(plainPassword)
console.log(this.password)
if(err) return cb(err);
cb(null, isMatch);
})
}
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(err) return cb(err);
cb(null, user);
})
}
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(err) return cb(err);
cb(null, user);
})
})
}
const User = mongoose.model('User', userSchema);
module.exports = {User}
도와주시면 감사하겠습니다ㅠㅠ
안녕하세요! 저도 같은 문제로 고민하고 있었는데 이 질문을 발견해서 답글 달아요!! proxy 안쓰고 cors를 이용해서 직접 통신하고 있는데 이럴때는 다르게 해주어야하나요??? 답변 주시면 정말 감사하겠습니다!!!