Passport JWT JSON Web 令牌验证错误
Passport JWT JSON Web Token authenticate error
我第一次实施涉及护照和 JWT 的身份验证。我的问题是:当我在 header 中发送一个已经过期的令牌时,我收到消息 "Unauthorized"。我的代码如下:
在routes.js中:
app.route('/people/:id')
// .all(function(req, res, next) {
// app.auth.authenticate(req, res, next);
// })
// .all(app.auth.authenticate)
.all(app.auth.authenticate())
.get(controller.getPeopleById)
.delete(controller.deletePeople);
评论部分都是我试过的
在auth.js中:
var passport = require("passport");
var passportJWT = require("passport-jwt");
var ExtractJwt = passportJWT.ExtractJwt;
var Strategy = passportJWT.Strategy;
module.exports = function(app) {
const options = {
secretOrKey: app.config.config.jwtSecret,
jwtFromRequest: ExtractJwt.fromAuthHeader()
};
var strategy = new Strategy(options, function(payload, done) {
console.log("payload: " + JSON.stringify(payload));
});
passport.use(strategy);
return {
initialize : function() {
return passport.initialize();
},
authenticate : function() {
return passport.authenticate('jwt', app.config.config.jwtSession);
// return passport.authenticate('jwt', app.config.config.jwtSession, function(error, done, info) {
// if (error) {
// console.log("error: " + error);
// }
// if (done) {
// console.log("done: " + JSON.stringify(done));
// }
// if (info) {
// console.log("info: " + info);
// }
// });
// }
}
}
};
在middlewares.js中:
var bodyParser = require("body-parser");
var config = require("./config/config")();
module.exports = function(app) {
app.set("port", config.port || 3000);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(app.auth.initialize());
};
我只想捕获认证中发生的错误来自定义消息,例如:"Token expired, log in again"但实际上,它没有进入策略的验证方法。有没有人经历过这个?感激不尽
Passport 总是抛出 AuthenticationError。
要获得实际错误,您必须提供对 passport.authenticate 方法的回调。
示例:
app.get('/protected', function(req, res, next) {
passport.authenticate('local', function(err, user, failuresOrInfo, status) {
// failuresOrInfo has the cause.
if (err) { return next(err) }
if (!user) { return res.redirect('/signin') }
res.redirect('/account');
})(req, res, next);
});
查看截取的护照代码:
function allFailed() {
if (callback) {
if (!multi) {
return callback(null, false, failures[0].challenge, failures[0].status);
} else {
var challenges = failures.map(function(f) { return f.challenge; });
var statuses = failures.map(function(f) { return f.status; });
return callback(null, false, challenges, statuses);
}
}
...
请注意,如果存在回调,passport 会将结果传递给回调,您必须管理其余部分。
希望我的回答清楚,对你有所帮助。
我第一次实施涉及护照和 JWT 的身份验证。我的问题是:当我在 header 中发送一个已经过期的令牌时,我收到消息 "Unauthorized"。我的代码如下:
在routes.js中:
app.route('/people/:id')
// .all(function(req, res, next) {
// app.auth.authenticate(req, res, next);
// })
// .all(app.auth.authenticate)
.all(app.auth.authenticate())
.get(controller.getPeopleById)
.delete(controller.deletePeople);
评论部分都是我试过的
在auth.js中:
var passport = require("passport");
var passportJWT = require("passport-jwt");
var ExtractJwt = passportJWT.ExtractJwt;
var Strategy = passportJWT.Strategy;
module.exports = function(app) {
const options = {
secretOrKey: app.config.config.jwtSecret,
jwtFromRequest: ExtractJwt.fromAuthHeader()
};
var strategy = new Strategy(options, function(payload, done) {
console.log("payload: " + JSON.stringify(payload));
});
passport.use(strategy);
return {
initialize : function() {
return passport.initialize();
},
authenticate : function() {
return passport.authenticate('jwt', app.config.config.jwtSession);
// return passport.authenticate('jwt', app.config.config.jwtSession, function(error, done, info) {
// if (error) {
// console.log("error: " + error);
// }
// if (done) {
// console.log("done: " + JSON.stringify(done));
// }
// if (info) {
// console.log("info: " + info);
// }
// });
// }
}
}
};
在middlewares.js中:
var bodyParser = require("body-parser");
var config = require("./config/config")();
module.exports = function(app) {
app.set("port", config.port || 3000);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(app.auth.initialize());
};
我只想捕获认证中发生的错误来自定义消息,例如:"Token expired, log in again"但实际上,它没有进入策略的验证方法。有没有人经历过这个?感激不尽
Passport 总是抛出 AuthenticationError。
要获得实际错误,您必须提供对 passport.authenticate 方法的回调。
示例:
app.get('/protected', function(req, res, next) {
passport.authenticate('local', function(err, user, failuresOrInfo, status) {
// failuresOrInfo has the cause.
if (err) { return next(err) }
if (!user) { return res.redirect('/signin') }
res.redirect('/account');
})(req, res, next);
});
查看截取的护照代码:
function allFailed() {
if (callback) {
if (!multi) {
return callback(null, false, failures[0].challenge, failures[0].status);
} else {
var challenges = failures.map(function(f) { return f.challenge; });
var statuses = failures.map(function(f) { return f.status; });
return callback(null, false, challenges, statuses);
}
}
...
请注意,如果存在回调,passport 会将结果传递给回调,您必须管理其余部分。
希望我的回答清楚,对你有所帮助。