Нужно ли передавать полезную нагрузку в этот код для генерации токена JWT? - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу использовать JWT для генерации токена для аутентификации пользователей. Когда я использую почтальон для проверки кода с зарегистрированным именем пользователя и паролем, он возвращает JsonWebTokenError: jwt malform. При внимательном рассмотрении я обнаружил, что ошибка происходит из раздела jwt.verify.

  1. Нужно ли передавать значение полезной нагрузки для создания токена?
  2. Как я могу настроить его так, чтобы, когда пользователь создает запрос на вход в систему, говорил, что он передает свое имя пользователя и пароль, а также адрес электронной почты и пароль, клиент должен передать идентификатор клиента ([payload + clientID]), чтобы сервер знал, для кого должен быть подписан токен.
  3. Есть ли какое-то специальное значение, которое мне нужно передать Postman Header для проверки работоспособности системы токенов?

КОД

const jwt = require('jsonwebtoken');
const fs = require('fs');

// PRIVATE and PUBLIC key
const publicKey = fs.readFileSync(__dirname + '/public.key', 'utf8');
const privateKey = fs.readFileSync(__dirname + '/private.key', 'utf8');

// Returns secret only known to server at runtime
exports.getSecret = () => {
  const secret = require('../config/secret.json').secret;
  return secret;
};

// Returns token
exports.getToken = (payload, signOptions) => {
  if (!signOptions) {
    signOptions = {
      issuer:  "Myself",
      expiresIn:  "30d", 
      algorithm:  "RS256"
    }    
  };
   const token = jwt.sign(payload, privateKey, options);
  return (token);
};

// Returns result of token validation
exports.validateToken = (token, verifyOptions) => {

  if (!verifyOptions) {
    verifyOptions = {
      issuer:  "Myself",
      expiresIn:  "30d", 
      algorithm:  "RS256"
    }    
  };
  try {
    return jwt.verify(token, publicKey, verifyOptions);
  } catch (err) {
    return err;
  }
};

// Returns validation result of token
exports.token_post = (req, res) => {
  res.send(this.validateToken(req.header.Authorization, this.getSecret()));
};

Оставшаяся часть кода ниже связана в файл разрешений, который используется для проверки пользователей. Ошибка показывает, что аргумент не доходит до части this.validateToken.

exports.hasPermission = (token, resource) => {
  const result = this.validateToken(token, this.getSecret());
  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;
  }
};

Я РЕДАКТИРОВАЛ ФУНКЦИЮ JWT. (ЗНАКА) КАК СЛЕДУЮЩИЙ

return jwt.sign(payload, privateKey, signOptions, function (error, token){
    if(error) {
      return done(new JsonWebTokenError('error in generating token: ' + error.message));
    } else {
      console.log("Token :" + token);
    }
  });
};

1 Ответ

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

jwt.sign() возвращает функцию обратного вызова, как это

jwt.sign(payload, expiration, function (error, token) {
    if(error) {
        // Faild Error 
    } else {
        // Get token and do continue
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...