Med*_*ric 1 javascript node.js express express-jwt passport-jwt
我最近将我在es6中制作的样板更改为稍微旧版本的es5.我不得不重新创建导出,需要而不是使用导入,现在路由功能正常.
我有这样的结构:
index.js (app)
api/index.js (/api endpoint)
api/auth.js (/api/auth endpoint)
api/protected.js (/api/protected endpoint)
Run Code Online (Sandbox Code Playgroud)
在我的身份验证路由中,我有登录和注册功能并生成令牌:
const token = jwt.sign({id: req.body.username}, config.jwtSecret)
Run Code Online (Sandbox Code Playgroud)
在我的protected.js中,我有以下内容:
const express = require('express');
const router = express.Router();
const passport = require('../config/passport');
router.use(passport.initialize({ session: false }));
router.use(passport.session());
router.get('/test', passport.authenticate('jwt') , (req, res) => {
res.status(200).json({ message: 'Hello sweetie', auth: req.isAuthenticated(), user: req.session.passport.user})
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
在我的passport.js
const
passport = require('passport'),
config = require('./../config'),
passportJwt = require('passport-jwt'),
JwtStrategy = passportJwt.Strategy,
ExtractJwt = passportJwt.ExtractJwt,
userSchema = require('./../schemas/userSchema');
passport.serializeUser(function(user, done) {
console.log(JSON.stringify(user));
done(null, user[0].username);
});
passport.deserializeUser(function(username, done) {
console.log('DESER -- '+username);
userSchema.checkUsername(username)
.then(user => {
console.log(user[0]);
done(null, user[0]);
})
.catch(err =>{
console.log(JSON.stringify(err));
});
});
const jwtOptions = {
secretOrKey: config.jwtSecret,
jwtFromRequest: ExtractJwt.fromHeader('authorization'),
}
passport.use('jwt', new JwtStrategy(jwtOptions, function(jwt_payload, done) {
console.log('Strategy: '+ jwt_payload.id);
userSchema.checkUsername(jwt_payload.id)
.then(user => {
console.log(user[0].username);
if(user[0]) return done(null, user)
else return done(null, false)
})
.catch(err =>{
console.log(JSON.stringify(err));
});
}));
module.exports = passport;
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试访问:127.0.0.1:8080/api/protected/test时,我登录的令牌给了我一个: Unauthorized
此外,console.log里面的:
永远不会显示,因此我认为不使用护照中间件.
我怎样才能获得/protected使用护照中间件的路线?
编辑:我已经尝试打印护照对象,我可以看到我的jwt策略确实已定义.所以我不明白为什么它不想通过它.
问题是你的护照正在寻找authorization标题而不是Authorization标题.
改变你的
jwtFromRequest: ExtractJwt.fromHeader('authorization')
至
ExtractJwt.fromAuthHeaderAsBearerToken()
所以你的选择会是这样的
const jwtOptions = {
secretOrKey: config.jwtSecret,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
}
Run Code Online (Sandbox Code Playgroud)
现在这样做是护照将寻找Authorization有价值的标题bearer your_jwt_token.
https://www.npmjs.com/package/passport-jwt
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |