Passport-jwt 身份验证不适用于 node-jwt-simple
Passport-jwt authenticate not working well with node-jwt-simple
我正在使用 passport-jwt
来验证一些路由,我正在使用 node-jwt-simple
/jwt-simple
创建我的 jwt
s 但面临一些困难,因为它看起来像我的 passport-jwt
身份验证中间件根本没有被调用。
这是我的
护照-jwt-策略
const jwtOpts = {
jwtFromRequest: ExtractJwt.fromHeader('Authorization'),
secretOrKey: secret,
};
passport.use(new jwtStrategy(jwtOpts, (payload, done) => {
console.log('payload ', payload.sub);
User.findById(payload.sub, (err, user) => {
if(err) { return done(err); }
if(!user) { console.log('didnt find!'); return done(null, false); }
done(null, user);
});
}));
然后我将它整合到这里。
路由文件
router.get('/success',
passport.authenticate('jwt', {session: false}),
async (ctx, next) => ctx.body = await "success!");
这也是我制作 jwt
.
的方法
function tokenForUser(user) {
const timeStamp = new Date().getTime;
return jwt.encode({sub: user._id, iat: timeStamp}, secret);
}
//- Later in signup process
userToSave.save(async(err, user) => {
if(err) { return next(err); }
const token = await tokenForUser(user);
next(token);
});
//- If this helps, here is how my secret file looks like.
const secret = "JKAha23ja1ddHdjjf31";
export default secret;
问题来了,当我点击那条路线时,我只得到 Unauthorized
并且在控制台中没有任何东西被注销 甚至我首先指定的 'payload' 键也没有注销.
我还应该说我在 ctx.request.get('Authorization')
有令牌(基于 Koa)我认为它类似于 req.header('Authorization')
在所有路线中都有快递。
此外 确切的基于快递的问题 可以在 node-jwt-simple
here 的 github 问题上找到,以防我的问题代码示例。
谢谢。
在我正确地思考之后,我知道这是我对整个身份验证过程如何运作的可怕理解。
当我从 ctx.get('Authorization')
解码令牌时,我得到的 _id
与存储在数据库中的令牌不同 因为 我硬编码了 授权header在postman和thought"If I ctx.set('Authorization', token);
It will replace the one I hardcoded on postman".
当我在前端进行 http 调用时,我没想到 jwt
会包含在 header 请求中。
我天真地认为 jwt
s 是直接从服务器传递到浏览器的(类似于 render
的工作方式)并且 Not 从服务器传递到浏览器一个 ajax
过程,稍后将其嵌入请求中,这是正确的方法。
整个代码很棒,除了现在我在注册时必须在创建令牌后传递令牌 ctx.body = token;
。
谢谢。
我正在使用 passport-jwt
来验证一些路由,我正在使用 node-jwt-simple
/jwt-simple
创建我的 jwt
s 但面临一些困难,因为它看起来像我的 passport-jwt
身份验证中间件根本没有被调用。
这是我的
护照-jwt-策略
const jwtOpts = {
jwtFromRequest: ExtractJwt.fromHeader('Authorization'),
secretOrKey: secret,
};
passport.use(new jwtStrategy(jwtOpts, (payload, done) => {
console.log('payload ', payload.sub);
User.findById(payload.sub, (err, user) => {
if(err) { return done(err); }
if(!user) { console.log('didnt find!'); return done(null, false); }
done(null, user);
});
}));
然后我将它整合到这里。
路由文件
router.get('/success',
passport.authenticate('jwt', {session: false}),
async (ctx, next) => ctx.body = await "success!");
这也是我制作 jwt
.
function tokenForUser(user) {
const timeStamp = new Date().getTime;
return jwt.encode({sub: user._id, iat: timeStamp}, secret);
}
//- Later in signup process
userToSave.save(async(err, user) => {
if(err) { return next(err); }
const token = await tokenForUser(user);
next(token);
});
//- If this helps, here is how my secret file looks like.
const secret = "JKAha23ja1ddHdjjf31";
export default secret;
问题来了,当我点击那条路线时,我只得到 Unauthorized
并且在控制台中没有任何东西被注销 甚至我首先指定的 'payload' 键也没有注销.
我还应该说我在 ctx.request.get('Authorization')
有令牌(基于 Koa)我认为它类似于 req.header('Authorization')
在所有路线中都有快递。
此外 确切的基于快递的问题 可以在 node-jwt-simple
here 的 github 问题上找到,以防我的问题代码示例。
谢谢。
在我正确地思考之后,我知道这是我对整个身份验证过程如何运作的可怕理解。
当我从 ctx.get('Authorization')
解码令牌时,我得到的 _id
与存储在数据库中的令牌不同 因为 我硬编码了 授权header在postman和thought"If I ctx.set('Authorization', token);
It will replace the one I hardcoded on postman".
当我在前端进行 http 调用时,我没想到 jwt
会包含在 header 请求中。
我天真地认为 jwt
s 是直接从服务器传递到浏览器的(类似于 render
的工作方式)并且 Not 从服务器传递到浏览器一个 ajax
过程,稍后将其嵌入请求中,这是正确的方法。
整个代码很棒,除了现在我在注册时必须在创建令牌后传递令牌 ctx.body = token;
。
谢谢。