0

我有以下用于生成令牌的代码。我遵循本教程。当我使用 postman 使用注册的用户名和密码测试代码时,它返回了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()));
};

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;
  }
};
4

1 回答 1

0

您没有向this.validateToken.

你应该给它verifyOptions而不是this.getSecret().

顺便说一句,这不是秘密而是公钥,所以我不建议使用这个名称。而且您正在阅读公钥两次。

您的hasPermission函数应如下所示:

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

不要忘记更改调用该函数的代码。$Options是您用来签署令牌的那个signOptions,在教程中。

于 2020-02-04T10:39:30.420 回答