2017-04-08 79 views
1

我想爲passport-jwt創建一個自定義中間件來處理認證。創建自定義護照-jwt策略中間件回調

這裏是我做了什麼來創建自己的中間件:

var models = require('../models'); 
var passport = require("passport"); 
var passportJWT = require("passport-jwt"); 
var config = require("../config/config.json"); 
var ExtractJwt = passportJWT.ExtractJwt; 
var Strategy = passportJWT.Strategy; 
var params = { 
    secretOrKey: config.jwtSecret, 
    jwtFromRequest: ExtractJwt.fromAuthHeader() 
}; 

/** 
* jwt authentication strategy 
*/ 
var strategy = new Strategy(params, function(payload, done) { 
    models.User.findById(payload.id) 
    .then((user)=>{ 
     if (user) { 
      return done(null, { 
       id: user.id, 
       username : user.username 
      }); 
     } else { 
      return done(new Error("User not found"), false); 
     } 
    }).catch((err)=>{ 
     return done(err, false); 
    }); 
}); 
passport.use(strategy); 

module.exports = { 
    initialize: function() { 
     return passport.initialize(); 
    }, 
    authenticate: (req, res, next)=>{ 
     passport.authenticate('jwt', { session: false }, (err, user, info)=>{ 
      if (err) { return next(err); } 
      if (!user) { return res.send("Custom Unauthorised").end(); } 
      // edit as per comment 
      //return res.send("Test Route Accessed").end(); 
      req.user = user; // Forward user information to the next middleware 
      next(); 
     })(req, res, next); 
    } 
}; 

,但每次我輸入「故宮開始」跑我面對這個錯誤的程序:

如果(request.headers [ AUTH_HEADER]){ ^ TypeError:無法讀取未定義的屬性'標題'。

在請求中設置授權標頭。

回答

1

是我沒有在這裏找到答案是:

首先定義的戰略邏輯:

var strategy = new Strategy(params, function (payload, done) { 
    //finding the user in the database 
    console.log(payload); 
    models.users.findById(parseInt(payload.userId)) 
     .then((user) => { 
      //if the user is found 
      if (user) { 
       return done(null, { 
        id: user.id, 
        username: user.username 
       }); 
      } else { 
       return done(new Error("User not found"), null); 
      } 
     }).catch((err) => { 
     console.log(err); 
      return done(new Error("uncaught error! try again later"), null); 
     }) 
}); 

然後進行護照使用策略」

passport.use(strategy); 

,最後導出初始化功能和中間件功能

module.exports = { 
    initialize: function() { 
     return passport.initialize(); 
    }, 
    authenticate: function (req, res, next) { 
     return passport.authenticate("jwt", { 
      session: false 
     }, (err, user, info) => { 
      if (err) { 
       console.log(err); 
       return next(err); 
      } 
      if (!user) { 
       return res.json({ 
        status: 'error', 
        error: 'ANOTHORIZED_USER' 
       }); 
      } 
      // Forward user information to the next middleware 
      req.user = user; 
      next(); 
     })(req, res, next); 
    } 
}; 

然後你可以調用上面定義的函數authenticate作爲路由中的中間件。

這裏有一個例子:

//import the express router 
var express = require('express'); 
var router = express.Router(); 
//here I am importing the functions defined above, I put them in the config folder 
var jwt_login_strategy = require('../config/jwt-login-strategy'); 
//and finally use the jwt_login_strategy as a middleware 
router.post('something', jwt_login_strategy.authenticate, your_other_middleware(req, res, next)=>{...}); 

你要調用的身份驗證功能,無需加括號,就這樣jwt_login_strategy.authenticate。

希望它能解決您的問題,因爲它爲我做了。