登录后未经授权Passport JWT

时间:2018-06-11 10:00:27

标签: javascript node.js jwt

我的带有护照-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);

1 个答案:

答案 0 :(得分:0)

我看到你正在使用fromAuthHeaderWithScheme来检查令牌。根据自述文件

  

创建一个新的提取器,在授权头中查找JWT,期望该方案与auth_scheme匹配。

这意味着当您使用/login登录时获取令牌时,您需要将其提供给请求的授权标头中的/dashboard。您的请求是否在标题中包含jwt-token?

相关问题