web api

时间:2018-03-12 19:02:47

标签: node.js express jwt

我的应用程序正在使用下面显示的标准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]应该等于这个秘密?

2 个答案:

答案 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;
  }
});




  • 在auth.controller.js文件中的verifyToken函数内部我们 解码令牌:



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'));