node.js 试图让护照和 ExtraxtJwt 工作
Posted
技术标签:
【中文标题】node.js 试图让护照和 ExtraxtJwt 工作【英文标题】:node.js trying to get passport and ExtraxtJwt to work 【发布时间】:2018-05-29 17:11:41 【问题描述】:我正在尝试在 node.js 中使用 jwt 和护照成功授权。 我将 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' );
);
);
);
也可能是我在发出 GET 请求时在邮递员中做错了什么?
【问题讨论】:
【参考方案1】:我真的很想让这个工作,但似乎新版本的护照和护照-jwt 的文档很差,而且很难调试......
我卸载了这两个模块并安装了 express-jwt,默认情况下所有路由都需要一个令牌。为了允许我的登录和注册路由,我只需要使用一行配置。
const expressJWT = require('express-jwt')
.
.
.
app.use(expressJWT(secret: secret).unless(path : ['/api/authenticate', '/api/register']))
我可以推荐这个解决方案来保护路由,因为它很容易设置和使用。但是,我不知道它与护照相比有多安全。
【讨论】:
以上是关于node.js 试图让护照和 ExtraxtJwt 工作的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置