Javascript 如何办理护照认证的特快路线
我最近将在es6中制作的一个样板文件更改为稍旧的es5版本。我必须重新创建导出,而不是使用导入,路由现在可以正常工作了 我有一个这样的结构:Javascript 如何办理护照认证的特快路线,javascript,node.js,express,express-jwt,passport-jwt,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) 在我的身份验证路径中,我具有登录和注册功能并生成令牌: const token = jwt.sign({id: re
index.js (app)
api/index.js (/api endpoint)
api/auth.js (/api/auth endpoint)
api/protected.js (/api/protected endpoint)
在我的身份验证路径中,我具有登录和注册功能并生成令牌:
const token = jwt.sign({id: req.body.username}, config.jwtSecret)
在my 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;
在我的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;
问题是当我尝试访问时:127.0.0.1:8080/api/protected/test
使用登录时获得的令牌,给我一个:Unauthorized
此外,控制台中的console.log
:
- 序列化用户
- 反序列化用户
- jwt战略
/protected
路由以使用passport中间件
编辑:我已尝试打印passport对象,我可以看到我的jwt
策略确实已定义。所以我不明白为什么它不想经历它
问题是您的护照正在查找
授权
标题,而不是授权
标题
换衣服
jwtFromRequest:ExtractJwt.fromHeader(“授权”)
到
ExtractJwt.fromAuthHeaderAsberToken()
所以你的选择看起来像
const jwtOptions = {
secretOrKey: config.jwtSecret,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
}
现在,passport将查找带有值的Authorization
头,您的\u jwt\u令牌
。
问题是您的护照正在查找
授权
标题,而不是授权
标题
换衣服
jwtFromRequest:ExtractJwt.fromHeader(“授权”)
到
ExtractJwt.fromAuthHeaderAsberToken()
所以你的选择看起来像
const jwtOptions = {
secretOrKey: config.jwtSecret,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
}
现在,passport将查找带有值的Authorization
头,您的\u jwt\u令牌
。
您是在发送标头中的jwtToken吗?@waqasno或是,我在发送时使用postman尝试请求将ExtractJwt.fromHeader(“授权”)替换为ExtractJwt.fromAuthHeaderBeareToken(),并使用postman authorization:bearer发送您的令牌_token@WaqasNoor谢谢你,不只是修改摘录。如果你不介意,请写一个答案和一些解释,这样我就可以接受它并给你赏金。你是在头中发送jwtToken吗?@WaqasNoor是的,我在发送它的同时尝试使用postman将ExtractJwt.fromHeader('authorization')替换为ExtractJwt.fromAuthHeaderBealerToken()并将您的代币以邮递员授权的方式发送:持票人您的_jwt_token@WaqasNoor谢谢你,不只是修改摘录。如果你不介意的话,写一个答案和一些解释,这样我就可以接受并给你奖金。