我的带有护照-JWT的应用程序不想在登录后正常工作我只能看到
未经授权
登录algorythm本身可以正常工作,因为它会检查用户凭据等,但护照应该使用的部分JWTStrategy
根本不起作用。我在这里遇到了多个问题和答案,在stackoverflow中希望找到答案,但我看不到任何有用的东西。我制作的整个概念是使用this tutorial构建的,但更改了小细节
fromAuthHeaderAsBearerToken => fromAuthHeaderWithScheme('jwt')
但仍然不起作用。登录后,我无法在浏览器上看到任何新的cookie设置。问题出在哪里?主要的是我甚至无法在Passport.js上找到并打印console.trace(jwtPayload);
:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const passportJWT = require("passport-jwt");
const ExtractJwt = passportJWT.ExtractJwt;
const JWTStrategy = passportJWT.Strategy;
const models = require('../models/index');
passport.use(new LocalStrategy({
usernameField: 'name',
passwordField: 'password'
}, (user, password, cb) => {
return models.User.findOne({
attributes: ['id', 'user_password', 'user_name'],
where: {user_name: user}
}).then(User => {
if (!User) return cb(null, false, {message: 'No matching results for such a user.'});
return User.validPassword(password).then(result => {
if (result !== true) return cb(null, false, {message: 'Invalid password for selected user'});
return cb(null, User.get({plain: true}), {
message: 'Logged In Successfully'
});
})
}).catch(err => {
return cb(err);
});
}));
let options = {};
options.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
options.secretOrKey = 'token';
options.expiresIn = (86400 * 30);
console.log(options);
passport.use(new JWTStrategy(options, function(jwtPayload, cb){
console.trace(jwtPayload);
return models.User.findOneById(jwtPayload.id).then(User => {
console.log(User);
if (User) {
return cb(null, User.get({plain: true}));
} else {
return cb(null, false);
}
}).catch(err => {
return cb(err);
});
}));
以及我的路由器来处理身份验证
router.post('/doAuth', function (req, res, next) {
passport.authenticate('local', {session: false}, (err, user, info) => {
if (err || !user) {
return res.json({
message: info ? info.message : 'Login failed',
status: 'error'
});
}
req.login(user, {session: false}, (err) => {
if (err) {
res.json({
message: err,
status: 'error'
});
}
const token = jwt.sign(user, 'token', {expiresIn: 86400 * 30});
return res.json({
message: 'Logged In Successfully!',
redirect: '/dashboard',
token: 'jwt ' + token,
success: true,
user: {
id: user.id,
name: user.user_name
}
});
});
})
(req, res);
});
所以在登录后我会被重定向到/dashboard
,因为它应该是,但在那里我只能看到未经授权。同样在我的app.js中,我正在使用身份验证。
const passport = require('passport');
require(Paths.Helpers + 'Passport');
app.use('/dashboard', passport.authenticate('jwt', {session: false}), userRouter);
答案 0 :(得分:0)
我看到你正在使用fromAuthHeaderWithScheme来检查令牌。根据自述文件
创建一个新的提取器,在授权头中查找JWT,期望该方案与auth_scheme匹配。
这意味着当您使用/login
登录时获取令牌时,您需要将其提供给请求的授权标头中的/dashboard
。您的请求是否在标题中包含jwt-token?