2017-08-28 14 views
2

私のノードJS APIをセットアップしようとしています。ノードJS認証パスポート - jwt無許可

私はUserモデルがあります:

// Dependencies 
var restful = require('node-restful'); 
var mongoose = restful.mongoose; 

var bcrypt = require('bcrypt'); 

// Schema 
var userSchema = new mongoose.Schema({ 
    username: { 
     type: String, 
     required: true, 
     unique: true}, 
    firstname: { 
     type: String, 
     required: true 
    }, 
    lastname: { 
     type: String, 
     required: true 
    }, 
    email: { 
     type: String, 
     required: true, 
     unique: true, 
     lowercase: true 
    }, 
    password: { 
     type: String, 
     required: true}, 
}, 
{ 
    timestamps: true 
}); 

// Saves the user's password hashed 
userSchema.pre('save', function (next) { 
    var user = this; 
    if (this.isModified('password') || this.isNew) { 
    bcrypt.genSalt(10, function (err, salt) { 
     if (err) { 
     return next(err); 
     } 
     bcrypt.hash(user.password, salt, function(err, hash) { 
     if (err) { 
      return next(err); 
     } 
     user.password = hash; 
     next(); 
     }); 
    }); 
    } else { 
    return next(); 
    } 
}); 


// Use bcrypt to compare passwords 
userSchema.methods.comparePassword = function(pw, cb) { 
    bcrypt.compare(pw, this.password, function(err, isMatch) { 
    if (err) { 
     return cb(err); 
    } 
    cb(null, isMatch); 
    }); 
}; 

module.exports = restful.model('Users', userSchema); 

私は認証のためにJWTにパスポートを使いたい:

// Dependencies 
var JwtStrategy = require('passport-jwt').Strategy; 
var ExtractJwt = require('passport-jwt').ExtractJwt; 
var config = require('../config/database'); 

// Load models 
var User = require('../models/user'); 

// Logique d'authentification JWT 
module.exports = function(passport) { 
    var opts = {}; 
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('JWT'); 
    opts.secretOrKey = config.secret; 
    opts.audience = 'localhost'; 

    passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    User.findById(jwt_payload._id, function(err, user) { 
     if (err) { 
     return done(err, false); 
     } 
     if (user) { 
     done(null, user); 
     } else { 
     done(null, false); 
     } 
    }); 
    })); 
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    Company.findById(jwt_payload._id, function(err, company) { 
     if (err) { 
     return done(err, false); 
     } 
     if (company) { 
     done(null, company); 
     } else { 
     done(null, false) 
     } 
    }); 
    })); 
}; 

と認証のための私のルート:

// User 
router.post('/users/login', (req, res) => { 
    User.findOne({ 
     email: req.body.email 
    }, (err, user) => { 
     if (err) throw err; 

     if (!user) { 
      res.json({success: false, message: 'Authentication failed. User not found.'}); 
     } else { 
      // Check if passwords matches 
      user.comparePassword(req.body.password, (err, isMatch) => { 
       if (isMatch && !err) { 
        // Create token if the password matched and no error was thrown 
        var token = jwt.sign(user, config.secret, { 
         expiresIn: 10080 // in seconds 
         }); 
        res.json({success: true, token: 'JWT ' + token, user: { 
         id: user._id, 
         username: user.username, 
         email: user.email 
        }});  
       } else { 
        res.json({success: false, message: 'Authentication failed. Passwords did not match.'}); 
       } 
      }); 
     } 
    }); 
}); 

すべてが素晴らしい仕事を郵便配達員に。 トークンが正しく生成され、ユーザーの情報で署名されています。

しかし、私は保護されたルート上の認証に問題があります。

router.get('/users/profile', passport.authenticate('jwt', { session: false }), function(req, res) { 
    res.send('It worked! User id is: ' + req.user._id + '.'); 
    }); 

毎回、それは私に「無断401」エラーを与えます。

私は本当に問題は、私が思うに、問題がjwtFromRequest周りです、私もベアラと試みたが、それはまた、動作しないところを知らない...

+0

あなたが同じ名前、当社とユーザーのための2つの戦略を持つ、多分パスポートを台無しに:ここで

あなたはJWT認証戦略とリフレッシュトークンの実装との例がありますか?私はそれが第2の戦略を使用していることを賞賛しますが、最初の –

答えて

関連する問題