Node.js 我如何使我的代码生成令牌并将其返回给用户进行身份验证?

Node.js 我如何使我的代码生成令牌并将其返回给用户进行身份验证?,node.js,express,jwt,postman,Node.js,Express,Jwt,Postman,我有下面生成令牌的代码。我明白这一点。当我使用postman用注册的用户名和密码测试代码时,它返回了JsonWebTokenError:jwt-malform。仔细查看后,我发现错误来自jwt.verify部分 我需要调整什么才能生成令牌 我如何配置它,以便当用户发出登录请求时,比如说他正在传递用户名和密码以及电子邮件和密码,客户端必须传递客户端标识([payload+clientID]),以便服务器知道令牌将为谁签名 是否有任何特殊值需要传入Postman Header,以测试令牌系统的工作情

我有下面生成令牌的代码。我明白这一点。当我使用postman用注册的用户名和密码测试代码时,它返回了
JsonWebTokenError:jwt-malform
。仔细查看后,我发现错误来自
jwt.verify
部分

  • 我需要调整什么才能生成令牌
  • 我如何配置它,以便当用户发出登录请求时,比如说他正在传递用户名和密码以及电子邮件和密码,客户端必须传递客户端标识([payload+clientID]),以便服务器知道令牌将为谁签名
  • 是否有任何特殊值需要传入
    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;
      }
    };
    

    您没有向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

    谢谢@Waelmio。让我试着调整我的代码。顺便问一下,你建议我在哪里使用公钥?我测试过,它对我有效。我将通过编辑我的答案发布代码。我看到您更改了代码,但是
    getSecret
    的返回值是多少?如果不是
    标志选项
    它仍然无法工作。您必须给出这些选项来验证令牌。@jetroowole您所说的“您建议我在哪里使用公钥”是什么意思?谢谢Waelmio。看到这么晚。让我先试试这个解决方案。