我正在尝试实现passport-jwt身份验证,但在尝试调用端点时,我总是收到401未授权的请求。
这是我的设置
passport.js
var passport = require('passport');
var User = require('../models/user');
var config = require('./auth');
var JwtStrategy = require('passport-jwt').Strategy;
var ExtractJwt = require('passport-jwt').ExtractJwt;
var LocalStrategy = require('passport-local').Strategy;
var localOptions = {
usernameField: 'email'
};
var localLogin = new LocalStrategy(localOptions, function(email, password, done) {
User.findOne({
email: email
}, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { error: 'Login failed. Please try again' });
}
user.comparePassword(password, function(err, isMatch) {
if (err) {
return done(err);
}
if (!isMatch) {
return done(null, false, { error: 'Login Failed. Please try again.' });
}
user.status = 'online';
user.save(function(err, user) {
if (err) {
return done(err);
}
});
return done(null, user);
});
});
});
var jwtOptions = {
jwtFromRequest: ExtractJwt.fromHeader('Authorization'),
secretOrKey: config.secret
};
var jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) {
console.log(payload);
User.findById(payload._id, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
done(null, user)
} else {
done(null, false);
}
});
});
passport.use(localLogin);
passport.use(jwtLogin);
module.exports = {
initialize: () => passport.initialize(),
authenticateJWT: passport.authenticate('jwt', { session: false }),
authenticateCredentials: passport.authenticate('local', { session: false }),
};user.js
var express = require('express');
var router = express.Router();
var AuthController = require('../controllers/authentication');
var passportService = require('../config/passport');
var passport = require('passport');
const requireToken = passportService.authenticateJWT;
const requireCredentials = passportService.authenticateCredentials;
router.post('/signup', AuthController.register);
router.post('/signin', requireCredentials, AuthController.login);
router.get('/protected', requireToken function(req, res, next){
res.send({msg:'Success!'});
});
module.exports = router;我已经确保我的头包含:'JWT‘+一些标记...也尝试了没有'JWT‘仍然没有…
我已经检查了关于相同问题的其他帖子,但仍然无法解决它。
发布于 2017-09-18 09:35:47
SHORT
遗留问题
'JWT ' + [some token]
版本0.4.0
'bearer ' + [some token]
示例
所以当你现在发送令牌的时候是这样的:
遗留问题
res.json ({ success: true, token: 'JWT ' + token })
版本0.4.0
res.json ({ success: true, token: 'bearer ' + token })
深度中的
也许还有其他方法可以做到这一点。
如果查看/node_module/passport-jwt/lib/extract_jwt.js文件,可以看到有一个名为versionOneCompatibility(options)的函数
发布于 2017-08-26 23:59:21
经过几个小时的尝试,我终于设法通过使用ExtractJwt.fromAuthHeaderWithScheme('Bearer')方法解决了这个问题。由于某些原因,提取器无法使用其他方法获取令牌。
发布于 2018-02-14 20:45:15
我也遇到了同样的问题,经过研究,我找出了导致这个问题的原因。当您在路由内创建res.json时
//Authenticate
router.post('/authenticate', (req, res, next) => {
const username = req.body.username;
const password = req.body.password;
User.getUserByUsername(username, (err, user) => {
if (err) throw err;
if (!user) {
return res.json({
success: false,
msg: 'User not found'
});
}
User.comparePassword(password, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
const token = jwt.sign(user.toJSON(), config.secret, {
expiresIn: 604800 // 1 week
});
res.json({
success: true,
token: 'jwt ' + token, //Here you have to put space after name inside quotes
user: {
id: user._id,
name: user.name,
username: user.username,
email: user.email
}
});
} else {
return res.json({
success: false,
msg: 'Wrong password'
});
}
});
});
});
在标记内部:‘jwt’+标记,在名称jwt后面加上一个空格是非常重要的,而且你放在‘’里面的名字也要用引号把你必须放在
var opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');//Here you have to put the same name inside quotes '' like you put inside token but without space after name
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
console.log(jwt_payload);
User.findOne({
id: jwt_payload.sub
}, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
}
});
}));
这两个必须匹配,不管你放的是jwt还是JWT,还是承载或其他任何东西,重要的是它们必须匹配,并且在创建令牌时必须有空格:“name”。
https://stackoverflow.com/questions/45897044
复制相似问题