2016-09-19 8 views
0

私はノードの初心者で、チュートリアルや例を参考にして立ち上げようとしています。私はローカル、Facebook、Twitter、Googleログインを許可するJSON APIを構築したいので、passport.jsを使用しています。現在、https://github.com/vitaly-t/pg-promise-demohttp://blog.slatepeak.com/refactoring-a-basic-authenticated-api-with-node-express-and-mongo/にマージしようとしています(申し訳ありませんが、このコードはスタイルの不一致です)、POSTで返されたログに問題が発生しています。正しい資格情報を提供するとPost/auth/login /私の資格が悪いとうまくいきます。実際にパスポートがローカルで何かをやっていない限り、なぜ行動が違うのか分かりません。私が関連していると思うのファイルがされています。誰でも提供できるノードエクスプレスpg-promiseパスポート - ローカルJWTポストできません

SERVER.js

'use strict'; 

var db = require('./db/db.js').db 
    , express = require('express') 
    , auth = require('./routes/auth') 
    , router = express.Router() 
    , app = express() 
    , routes = require('./routes/routes.js') 
    , bodyParser = require('body-parser') //must be before passport 
    , config = require('./conf/main'); 

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 
app.use('/auth', auth); 

// Enable CORS from client-side - Will I need this? 
app.use(function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, Access-Control-Allow-Credentials"); 
    res.header("Access-Control-Allow-Credentials", "true"); 
    next(); 
}); 

////////////////////////////////////////////// 
// Users Web API 
////////////////////////////////////////////// 
app.post('/users/local', routes.userAddLocal); 
app.get('/users', routes.getAllUsers); //This should go into the Admin App. Will they both be able to use Postgres at once? 


app.listen(config.port,() => { 
    console.log('\nReady for requests on http://localhost:' + config.port); 
}); 

AUTH.js

'use strict'; 
///////////////////////// Passport Setup 

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy 
    , JwtStrategy = require('passport-jwt').Strategy 
    , ExtractJwt = require('passport-jwt').ExtractJwt 
    , jwt = require('jsonwebtoken') 
    , db = require('../db/db.js').db 
    , config = require('../conf/main') 
    , express = require('express') 
    , bodyParser = require('body-parser') //must be before passport 
    , bcrypt = require('bcrypt-nodejs'); 

const jwtOptions = { 
    // Telling Passport to check authorization headers for JWT 
    jwtFromRequest: ExtractJwt.fromAuthHeader(), 
    // Telling Passport where to find the secret 
    secretOrKey: config.secret 
}; 

passport.use('local', new LocalStrategy({ 
    usernameField: 'email' 
    , passReqToCallback: false 
    , session: false //Turn off sessions, this is a stateless REST service using JWT 
    }, 
    function(username, password, done) { 
    db.users.findByEmail(username) 
     .then(function (user){ 
      if (!user) { return done(null, false); } 
      var pwMatch = bcrypt.compareSync(password, user.password); 
      if (!pwMatch) { return done(null, false); } 
      return done(null, user); 
     }) 
     .catch(function(error){ 
      return done(error); 
     }) 
    } 
)); 

passport.use('jwt', new JwtStrategy(jwtOptions, function(payload, done) { 
    console.log("jwt strategy top line"); 
    db.users.findById(payload._id) //maybe need payload.doc._id or payload.document._id 
     .then(function (user){ 
      if (user) { 
       done(null, user); 
      } else { 
       done(null, false); 
      } 
     }) 
     .catch(function(error){ 
      return done(err, false); 
     }) 
})); 

function generateToken(user) { 
    return jwt.sign(user, config.secret, { 
    expiresIn: 10080 // in seconds 
    }); 
}; 

var authRoutes = express.Router(); 
authRoutes.use(bodyParser.urlencoded({ extended: true })); 
authRoutes.use(bodyParser.json()); 
authRoutes.use(passport.initialize()); 

authRoutes.post('/login/local', passport.authenticate('local', { 
    function(req, res) { 
     var tokenObj = auth.generateToken({email: req.body.email, displayName: req.body.DisplayName}); 
     res.status(201).json({ 
      token: 'JWT ' + tokenObj, 
      user: req.body.displayName 
     }); 
    }, 
     failureRedirect: '/auth/notauth', 
     session: false 
    })); 

authRoutes.get('/notauth', function (req, res){ 
    res.status(401).send("Login Failed"); 
}); 

module.exports = authRoutes; 
module.exports.generateToken = generateToken; 

任意の助けもいただければ幸いです。

編集#1:PORT( 'login/local')のルートを書き直そうとしましたが、今はログインしますが、何らかの理由でreqとreq.userオブジェクトを利用できません。私はGoogleにセッションを含める必要があると言いますが、私はセッションを使用していないので、これは私のためには適切ではありません。ここでは、新たなルートがあります:

authRoutes.post('/login/local', passport.authenticate('local', 
    function(req, res){ 
     console.log("authentication successful"); 
     var tokenObj = generateToken({email: req.body.email, displayName: req.body.DisplayName}); 
     res.status(201).json({ 
      token: 'JWT ' + tokenObj, 
      user: req.body.displayName 
     }); 
    } 
    , {failureRedirect: '/auth/notauth'} 
    , {session: false} 
)); 

誰かがreq.userはパスポートのドキュメントあたりとして利用できるようになりますように、この問題を解決する方法を教えてもらえますか?

編集#2:success関数がnullを取得していて、usersテーブルのdbレコードを含むオブジェクトのようです。ユーザーが正常にログオンしたときに返すものとまったく同じです。どういうわけか私はPassport-Localを壊してしまいました。

答えて

0

は、それはいくつかの変更で動作するようになった:

passport.use('local', new LocalStrategy({ 
    usernameField: 'email' 
    // , passReqToCallback: false 
    , passReqToCallback: true 
    , session: false //Turn off sessions, this is a stateless REST service using JWT 
    }, 
    //function(username, password, done) { 
     function(req, username, password, done) { 
    db.users.findByEmail(username) 
     .then(function (userRecord){ 
      if (!userRecord) { return done(null, false); } 
      var pwMatch = bcrypt.compareSync(password, userRecord.password); 
      if (!pwMatch) { return done(null, false); } 
      //return done(null, userRecord); 
      return done(null, req, userRecord); 
     }) 
     .catch(function(error){ 
      return done(error); 
     }) 
    } 
)); 

authRoutes.post('/login/local', passport.authenticate('local', 
    function(err, req, userRecord){ 
     console.log("authentication successful"); 
     var tokenObj = generateToken({email: userRecord.email, displayName: userRecord.DisplayName}); 
     var res = req.res; //nfi why i need this 
     res.status(201).json({ 
      token: 'JWT ' + tokenObj, 
      user: userRecord.displayName 
     }); 
    } 
    , {failureRedirect: '/auth/notauth'} 
    , {session: false} 
)); 
関連する問題