【问题标题】:Trying to decode jwt token from server side尝试从服务器端解码 jwt 令牌
【发布时间】:2020-05-07 20:13:40
【问题描述】:

我创建了一个 CLI,通过它使用我使用 node.js 和 express.js 构建的 rest api 中的数据。在 cli 中,用户必须登录,然后当他执行查询时,他的数据使用 jwt 作为标头传递。这是我用以下代码完成的:

Login.ts 文件有这部分用于创建标头的代码:

await connection.query(`SELECT user,pass,email,quota,apikey,privileges FROM users WHERE user=?`,[`${flags.user}`], function (err, result, fields) {
                if (err) throw err;
                //console.log(`${flags.user}`);
                //console.log(result[0].pass);
                var u=result[0].user;
                var p=result[0].pass;
                var e=result[0].email;
                var q=result[0].quota;
                var a=result[0].apikey;
                var p=result[0].privileges;
                const password=result[0].pass;
                if(bcrypt.compareSync(`${flags.passw}`, password)) {
                    var fs=require('fs');
                    var privateKey = fs.readFileSync('private.key');
                    var jwt=require('jsonwebtoken');
                    var token = jwt.sign({user:`${flags.user}`,passw:`${flags.passw}`,email: e, quota: q,apikey: a,privileges: p }, privateKey, { algorithm: 'RS256' });
                    fs.writeFileSync("temptoken.txt",token);
                } else {
                    console.log("Wrong username or password\n");
                }       
         });

登录后用户可以执行各种查询,在他们的代码中他们执行一个

axios.get 我这样传递标头:

    const axios = require('axios');
        const {flags} = this.parse(ActualTotalLoadCommand); 
        var fs=require('fs');
        var token = fs.readFileSync('temptoken.txt');
        axios.defaults.headers.common['Authorization']=token;

从我有文件 entry.routes.js 的服务器端文件中如何捕获令牌然后对其进行解码以测试例如执行查询的用户是否是有效用户 ?

entry.routes.js 如下所示:

module.exports = app => {
  const entry = require("../controlers/entry.controller.js");

  // Retrieve a single Entry with Id
  var fs=require('fs');
  var privateKey = fs.readFileSync('/home/vangelis/softeng/energy/private.key');
  var jwt=require('express-jwt');
  app.use(
    jwt({
      secret: privateKey,
      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;
      }
    }));
  app.get("/entry/:Id", entry.findOne);

  app.get("/energy/api/ActualTotalLoad/:AreaName/:Resolution/date/:Year-:Month-:Day", entry.findTwo);

如您所见我尝试使用 express-jwt,但无法正常工作。

【问题讨论】:

    标签: javascript node.js typescript express jwt


    【解决方案1】:

    在上面的代码中,您使用以下代码创建标题:

    axios.defaults.headers.common['Authorization']=token;
    

    这将导致

    Authorization: <the token>

    但在代码中读取标题:

    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') 
    

    你期望这样的标题:

    Authorization: Bearer <the token>

    这是标准方式。所以你应该在行中添加Bearer 来创建标题。

    除此之外,我看到您将(加密的)密码放入令牌中。这是你应该避免的。没有充分的理由这样做。您在创建令牌之前已经对用户进行了身份验证,现在,当您收到令牌时,您可以通过它的签名来验证该令牌的真实性。

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 2015-11-26
      • 2018-06-12
      • 2021-12-30
      • 2018-10-05
      • 2019-06-27
      • 2019-05-19
      • 2021-12-12
      • 2018-08-14
      相关资源
      最近更新 更多