node.js试图让护照和ExtraxtJwt工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js试图让护照和ExtraxtJwt工作相关的知识,希望对你有一定的参考价值。
我正在尝试成功授权在node.js中使用jwt和passport。我正在使用passport.use和JwtStrategy。
我已经设置了我的一条路线上的身份验证,以测试它会在没有令牌的情况下取消对我的授权,
// Profile
router.get('/profile', passport.authenticate('jwt', { session: false }), (req, res, next) => {
res.json({ user: req.user });
});
当我向邮递员发送邮件请求到http://localhost:3000/users/profile时,我得到Unauthorized
到目前为止这么好......
当我通过localhost:3000 / users / authenticate使用正确的用户名和密码登录邮递员时,我会收到一个令牌。看起来像这样:
{
"success":true,
"token":"JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVhMzNiMzE1NDFlYWU1MDk2MDRhNTE0ZiIsIm5hbWUiOiJyYXMiLCJlbWFpbCI6InJhc0BwLmQiLCJ1c2VybmFtZSI6InJwdWxzIiwicGFzc3dvcmQiOiIkMmEkMTAkTFR5eS50TmdualB2a0htWXNuUkV0TzRwWEVEL0gycDJCYWRDRlVXMUtWaXI5TnltSUtnVUciLCJfX3YiOjB9LCJpYXQiOjE1MTMzNDI1MjksImV4cCI6MTUxMzk0NzMyOX0.amCkcFWtPwf_HYUxpXOPvcRShksH9fw7O4vVOsBm4yA",
"user":{
"id":"5a33b31541eae509604a514f",
"name":"n",
"username":"testUser",
"email":"bla@bla"}
}
我试图抓住那个令牌,就像这样:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVhMzNiMzE1NDFlYWU1MDk2MDRhNTE0ZiIsIm5hbWUiOiJyYXMiLCJlbWFpbCI6InJhc0BwLmQiLCJ1c2VybmFtZSI6InJwdWxzIiwicGFzc3dvcmQiOiIkMmEkMTAkTFR5eS50TmdualB2a0htWXNuUkV0TzRwWEVEL0gycDJCYWRDRlVXMUtWaXI5TnltSUtnVUciLCJfX3YiOjB9LCJpYXQiOjE1MTMzNDI1MjksImV4cCI6MTUxMzk0NzMyOX0.amCkcFWtPwf_HYUxpXOPvcRShksH9fw7O4vVOsBm4yA
并将其添加为Authorization
标题,但我仍然得到Unauthorized
.....这真的很难继续,因为我得到绝对没有错误消息。
这是我的护照代码:
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user');
const config = require('../config/database');
module.exports = function (passport) {
let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
User.getUserById(jwt_payload._id, (err, user) => {
if (err) {
return done(err, false);
console.log(err);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
}
});
}));
}
这行是问题吗? opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
我也尝试过使用ExtractJwt.fromAuthHeaderWithScheme(“jwt”),但结果相同。
这是我的身份验证代码(我猜想因为我在登录时使用正确的用户/通行证回来了一个令牌)
// 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({data: user}, config.secret, {
expiresIn: 604800 // 1 week
});
res.json({
success: true,
token: 'JWT ' + token,
user: {
id: user._id,
name: user.name,
username: user.username,
email: user.email
}
});
} else {
return res.json({ success: false, msg: 'Wrong password' });
}
});
});
});
我真的希望这个工作,但似乎新版本的护照和护照-jwt文档很差,而且很难调试....
我卸载了两个模块并安装了express-jwt,默认情况下需要为所有路由提供令牌。为了允许我登录和注册路由,我只需要使用一行配置。
const expressJWT = require('express-jwt')
.
.
.
app.use(expressJWT({secret: secret}).unless({path : ['/api/authenticate', '/api/register']}))
我可以推荐这种解决方案来保护路由,因为它很容易设置和使用。然而,我不知道它与护照相比有多安全。
以上是关于node.js试图让护照和ExtraxtJwt工作的主要内容,如果未能解决你的问题,请参考以下文章