Как я могу сделать свой код для генерации токена JWT для авторизации и разрешения пользователя? - PullRequest
0 голосов
/ 05 февраля 2020

Я не знаю, как заставить это работать. У меня есть два файла, permissionCtrl.js и tokenCtrl.js. Я использую nJWT , Node.js / Express. js, Sequelize & Postgres.

Файл разрешений содержит hasPermission функцию, которая ссылается на файл токена , Предполагается, что функция hasPermission проверяет токен, сгенерированный в файле токена, и возвращает либо результат успешного обратного вызова, либо ответ 403 с сообщениями, показанными ниже. В случае успеха он предоставит пользователю доступ к безопасному маршруту на основе их роли и уровня доступа. Обратите внимание, что tokenCtrl.hasPermission.js импортируется в этот файл.

hasPermission. js

exports.hasPermission = (req, res, permission, success) => {
  const token = req.get('Authorization');
  const hasPermission = tokenCtrl.hasPermission(token, permission); //tokenCtrl.hasPermission not a function error here
  console.log('permission', permission);
  if (hasPermission) {
    return success();
  } else {
    res.status(403);
    return res.json({
      error: {
        status: 403,
        message: 'Unauthorized',
      },
    });
  }
};

tokenCtrl. js

const nJwt = require('njwt');
const secureRandom = require('secure-random');
const signingKey = secureRandom(512, {type: 'Buffer'}); // Create a highly random byte array of 256 bytes
const base64SigningKey = signingKey.toString('base64');

const claims = {
  iss: "mysite.com",  // The URL of your service
  sub: "users/user1234",    // The UID of the user in your system
  scope: "user, admins"
};

module.exports = {

  // Returns token
  getToken: (claims, signingKey) => {
    const jwt = nJwt.create(claims, signingKey, 'HS512');
    console.log(jwt);
    const token = jwt.compact();
     console.log("Token :" + token);
    return (token);
},

  // Returns result of token validation
    validateToken: (token, signingKey) => {
      nJwt.verify(token, signingKey, 'HS512', function(err, verifiedJwt){
        if(err){
          console.log(err); // Token has expired, has been tampered with, etc
        }else{
          console.log(verifiedJwt); // Will contain the header and body
        }
        return (verifiedJwt);
      });
  },

  token_post: (req, res) => {
  res.send(this.validateToken(req.header.Authorization, signingKey));
},

getSecret: () => {
  const secret = require('../config/secret.json').secret;
  console.log('secret', secret);
  return secret;
},

hasPermission: (token, resource) => {
  const result = this.validateToken(token, signingKey); //this.validateToken not a function error here
  console.log(result);
  if (result.name === 'JsonWebTokenError') {
    return false;
  } else if (result.permissions) {
    let permissionSet = new Set(result.permissions);
    console.log('permissions in token', JSON.stringify(permissionSet));
    return permissionSet.has(resource);
  } else {
    return false;
  }
}

}

ОШИБКИ

  1. this.validate Здесь не указана ошибка функции, как показано в комментарии к коду

  2. tokenCtrl.hasPermission здесь не является ошибкой функции, как показано в комментарии к коду

ПРИМЕЧАНИЕ. Функция getSecret в файле tokenCtrl используется другими файлами.

1 Ответ

0 голосов
/ 05 февраля 2020

Вы сталкиваетесь с тем, как this связан в функциях стрелок. Ранее функции создавали новый пустой this во внутренней области видимости, в стрелке функции this привязаны к внешней области. Поскольку вы объявляете функцию внутри объекта экспорта, вы можете ожидать, что this свяжется с вмещающим объектом, но нет.

Я предлагаю просто объявить ваши функции, а затем добавить их в ваши экспорты. Таким образом, вы можете избежать использования this и просто вызвать функцию validateToken.

const validateToken = (token, signingKey) => {
      nJwt.verify(token, signingKey, 'HS512', function(err, verifiedJwt){
        if(err){
          console.log(err); // Token has expired, has been tampered with, etc
        }else{
          console.log(verifiedJwt); // Will contain the header and body
        }
        return (verifiedJwt);
      });
  };

const hasPermission = (token, resource) => {
  const result = validateToken(token, signingKey); //this.validateToken not a function error here
  console.log(result);
  if (result.name === 'JsonWebTokenError') {
    return false;
  } else if (result.permissions) {
    let permissionSet = new Set(result.permissions);
    console.log('permissions in token', JSON.stringify(permissionSet));
    return permissionSet.has(resource);
  } else {
    return false;
  }
};

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