我的应用程序正在使用下面显示的标准jwt身份验证,并从express-jwt自述文件中复制。
app.use(jwt({
secret: 'hello world !',
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
}));
当我点击api时,授权标题等于'Bearer hello world!'。这等于我的秘密,但是我得到了一个未经授权的401抛出。有谁知道为什么?是不是req.headers.authorization.split('')[1]应该等于这个秘密?
答案 0 :(得分:1)
没有持票人不是你的秘密。它是一个base64编码的jwt,包含(标题,有效负载和签名)。该秘密用于使用jwt头中指定的算法对jwt有效负载进行签名。
阅读official JWT website上的介绍,了解这一概念。
答案 1 :(得分:0)
您可以使用JsonWebtoken npm包在您的快速应用程序中实现基于jwt的身份验证。 这是身份验证的工作方式:
从包中导入jwt
const jwt = require(' jsonwebtoken');
在login.service.js文件中设置令牌,或者在需要时使用适当的数据作为有效负载:
const token = jwt.sign('payload', 'secret key',
{ expiresIn: 60*60 });
how token looks: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYW5pcyIsImVtYWlsIjoic29tZW1lYWlsLmNvbSIsImlhdCI6MTUxNjIzOTAyMn0.FyDrUNkvDi82lYv8JioAB9Ih8vyn6Y6mY8PpUiIz8nY
您可以通过在jwt.io网站上粘贴令牌来解码它。
通常我们将令牌存储在cookie中(在login.router.js文件中发送响应之前将cookie设置为令牌):
router.get('/auth/google/callback', (req, res, next) => {
loginCtrl.redirectGoogle(req, res, next).then((result) => {
res.cookie('userToken', token);
res.redirect('/#/app/home');
}, (err) => {
console.log("Error in authentication **[ ", err, " ]** ");
res.redirect(500, '/#/login');
});
现在编写一个在每个API请求(authentication.router.js文件)之前调用的中间件(身份验证)。
router.use((req, res, next) => { // eslint-disable-line consistent-return
try {
const token = req.cookies.currentUser;
// console.log('cookie', token);
// to decode token
if (token) {
authCtrl.verifyToken(token, (err, decoded) => {
if (err) {
res.clearCookie(config.UserToken);
res.status(401).json({ error: ' Session Timeout... Please login again' });
// console.log('token expired');
// res.redirect('/#/login');
} else {
req.user = decoded;
next();
}
// console.log('Token verified');
// res.cookie(config.cookie.name,successResult.authToken);
});
} else {
// if there is no token
// return an error
return res.status(403).send({
message: 'User not authenticated.',
});
}
} catch (error) {
// console.log(error);
return error;
}
});

const jwt = require('jsonwebtoken');
const verifyToken = (usertoken, done) => {
jwt.verify(usertoken,'secret key', (err, res) => {
if (err) {
return done(err);
}
return done(null, res);
});
};
module.exports = {
verifyToken,
};

现在,您的API端点受到身份验证的保护。确保身份验证中间件位于app.js文件的顶部。
router.use('/login', require('./modules/login'));
router.use('/logout', (req, res) => {
res.clearCookie(userToken);
res.redirect('/');
});
router.use(require('./modules/authentication'));
// Each Module to be placed after this
router.use('/communityMembers',require('./modules/communitymember'));