node.js - Passport jwt 401未经授权

标签 node.js authentication jwt passport.js

我正在尝试实现 passport-jwt 身份验证,但在尝试调用端点时总是收到 401 Unauthorized。

这是我的设置

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 }),
};

用户.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;

我已确保我的 header 包含:'JWT' + [some token]... 也试过没有 'JWT ' 仍然没有......

我已经检查了其他关于相同问题的帖子,但仍然无法解决。

最佳答案

简短
遗产
'JWT' + [一些 token ]

版本 0.4.0
'bearer' + [some token]

示例
所以当你现在发送 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)

的函数

关于node.js - Passport jwt 401未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45897044/

相关文章:

node.js - 使用 Mongoose 查找所有文件

authentication - Symfony 2 身份验证与(学说)实体

linux - 创建新用户时如何创建用户密码散列的盐,之后与 crypt() 一起使用?

security - 如何在域之间传递 JWT session token ?

node.js - 从 Aerospike node.js 客户端检索主键

node.js - (Node JS + Express) 如何渲染位于/views/subfolder/中的文件?

openssl - jwt.io 上的 "secret base64 encoded"是什么意思,我将如何用 `openssl dgst` 模拟它

c# - 使用 JWT 声明对 .NET Core Web API Controller 进行单元测试

node.js - 在创建信封之后但在生成收件人 View 之前添加标签

python - 如何使用自定义 Django 后端?