2017-11-16 12 views
0

jwt로 여권 인증을 구현하고 싶지만 실행 후 토큰이 있지만 get 함수가 작동하지 않습니다. 내가 passport.authenticate를 제거하면 잘 동작합니다. passport.authenticate가 get 함수에 추가되면 console.logs도 작동하지 않습니다.JWT를 사용하는 nodejs에서 여권 인증이 작동하지 않습니다.

내 passport.js 파일 코드

const JwtStrategy = require('passport-jwt').Strategy; 
const ExtractJwt = require('passport-jwt').ExtractJwt; 
const User = require('./../server/models/user'); 


module.exports = function(passport){ 
console.log('passport'); 
let opts = {}; 
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken('jwt') 
opts.secretOrKey = "secretkey"; 
passport.use(new JwtStrategy(opts, (jwt_payload, done) => { 
    console.log(jwt_payload); 
    User.getUserById(jwt_payload._doc._id, (err, user) => { 
     if(err){ 
      return done(err, false); 
     } 
     if(user){ 
      return done(null, user); 
     }else{ 
      return done(null, false); 

     } 
    }); 
})); 
} 

api.js (수 기능)

router.get('/profile', passport.authenticate('jwt', {session: false}), 
function(req, res){ 
console.log("prof"); 
res.json({user: req.user}); 
}); 

의 user.js (모델) 당신이 우편 배달부에서 토큰을 복사

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 
var bcrypt = require('bcrypt-nodejs'); 



const userSchema = new Schema({ 
username: { type:String, lowercase:true, required:true, unique:true}, 
password: { type:String, required:true}, 
email: { type:String, lowercase:true, required:true, unique:true}, 

}); 

userSchema.pre('save', function(next){ 
var user = this; 
bcrypt.hash(user.password, null, null, function(err, hash) { 
    // Store hash in your password DB. 
    if(err) return next(err); 
    user.password = hash; 
    next(); 
}); 
}) 




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

module.exports.getUserById = function(id, callback){ 
    User.findById(id, callback); 
} 

module.exports.getUserByUsername = function(username, callback){ 
const query = {username: username}; 
User.findOne(query, callback); 
} 

module.exports.comparePassword = function(candidatePassword, hash, callback) 


{ 
    bcrypt.compare(candidatePassword, hash, function(err, isMatch) { 
     if(err){ 
      throw err; 
     } 
     callback(null, isMatch); 
    }); 

} 

답변

0

토큰 시작 부분에 'JWT'다음에 공백이 있는지 확인하십시오. '/ 인증'api에 복사하십시오.

  res.json({ 
        success: true, 
        token: 'JWT '+token, 
        user: { 
         id: resUser._id, 
         name: resUser.username, 
         email: resUser.email 
        } 
       })