PassportJS - 在将有效负载数据作为请求参数传递给passport.authenticate之前获取它

时间:2017-03-09 14:51:40

标签: javascript angularjs node.js passport.js cryptojs

有一个passport.js实现用于LDAP-auth工作。现在,下一步是使用Crypto-js在客户端加密密码,如下所示:

Client-side angular-js controller

$scope.authenticate = function () {      
  var auth = new login();
  auth.username = $scope.username;
  auth.password = CryptoJS.AES.encrypt($scope.password); //// HERE  

  auth.$save(function (response){
    console.log(response);
  },function(err){
    console.log(err);
  });
}

Server-side service

.....
.....
app.post('/login', passport.authenticate('ldapauth'), (req, res) => {

    console.log("req.user: ",req.user);
    req.session.username = req.user[ldap.username];
    req.session.userModel = req.user;
    res.status(200).send({"success": 'success'});
});
.....

在使用请求'req'调用passport.authenticate之前的服务器端服务上,需要解密aes加密密码。怎么能在这里实施? (问题不是关于加密,而是如何在将数据作为请求传递给passport.authenticate之前获取数据)

1 个答案:

答案 0 :(得分:2)

@Abhijay Ghildyal我不认为他们理解你的问题。确实可以在将请求传递给passport.authenticate()之前拦截该请求。您要做的是将这段代码添加到您的express.js或您执行快速服务器的任何文件。此外,我在这里解密request.body而不是req.user用户尚未登录的时间,但如果您的情况不同,那么您可以用同样的方式解密req.user。 (此处的变量应用是服务器的名称,即var app = express();

app.use(function(req, res, next) {
    if(req.url === '/login'){
        //CryptoJS.AES.decrypt() is Assumed to be the decrypter function here.
        req.body = CryptoJS.AES.decrypt(req.body);
        console.log(req.body); //To view decrypted body
    }
    next();
});

就是这样。在passport.authenticate()函数之前,将首先访问此中间件函数。只需确保在导入bodyParser( bodyParser = require(' body-parser')之后,您是否将此应用于req.body,首先添加这些代码行; )在上面的段落之前。

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());