Попытка декодировать токен jwt со стороны сервера - PullRequest
0 голосов
/ 21 января 2020

Я создал CLI, с помощью которого я получаю данные из остальных API, которые я строю с node.js и express. js. В результате пользователь должен войти в систему, и после этого, когда он выполняет запрос, его данные передаются в виде заголовка с использованием 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 , но не могу заставить его работать.

1 Ответ

0 голосов
/ 21 января 2020

В приведенном выше коде вы создаете заголовок с:

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

, что приводит к

Authorization: <the token>

, но в коде для чтения заголовка:

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

вы ожидаете заголовок, подобный этому:

Authorization: Bearer <the token>

, который является стандартным способом. Поэтому вам нужно добавить Bearer в строку для создания заголовка.

Кроме того, я вижу, что вы вводите (зашифрованный) пароль в токен. Это то, что вы должны избегать. Нет веских причин для этого. Вы аутентифицировали пользователя до того, как создали токен, и теперь, когда вы получаете токен, вы проверяете подлинность этого токена по его подписи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...