Javascript 即使在授权中输入令牌,JWT也会返回无效的签名错误

Javascript 即使在授权中输入令牌,JWT也会返回无效的签名错误,javascript,node.js,jwt,json-web-token,express-jwt,Javascript,Node.js,Jwt,Json Web Token,Express Jwt,我已经查看了这个堆栈溢出条目,但在那里找不到解决方案 我试图编写一个小节点应用程序,作为使用JWT访问令牌的概念证明。我去了,并试图跟随视频教程。我得到了一个生成的令牌,但是当它实际使用令牌时,我得到了一个“UnauthorizedError:invalid signature”错误。下面是我的源代码 const myUsername = 'ironflag'; const express = require('express'); const expressJWT = require('exp

我已经查看了这个堆栈溢出条目,但在那里找不到解决方案

我试图编写一个小节点应用程序,作为使用JWT访问令牌的概念证明。我去了,并试图跟随视频教程。我得到了一个生成的令牌,但是当它实际使用令牌时,我得到了一个“UnauthorizedError:invalid signature”错误。下面是我的源代码

const myUsername = 'ironflag';
const express = require('express');
const expressJWT = require('express-jwt');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const PORT = 2000;

// App
const app = express();

//fake data
let killerBeez = {
  members: 9,
  location: 'staten island',
  stateOfBeing: 'wu-tang forever',
  memberList: [
    {
      name: 'RZA',
      alias: ['Bobby Steels', 'Prince Raheem', 'Bobby Digital', 'The Abbot']
    },
    {
      name: 'GZA',
      alias: ['The Genius','Drunken Monk']
    },
    {
      name: 'Ol\' Dirty Bastard',
      alias: ['Big Baby Jesus', 'Dirt McGirt', 'Ason Unique']
    },
    {
      name: 'Inspecta Deck',
      alias: 'Rebel INS'
    },
    {
      name: 'Raekwon the Chef',
      alias: 'Lex Diamond'
    },
    {
      name: 'U-God',
      alias: 'Baby U'
    },
    {
      name: 'Ghostface Killah',
      alias: ['Tony Starks', 'Big Ghost', 'Ironman']
    },
    {
      name: 'Method Man',
      alias: ['Johnny Blaze', 'Iron Lung']
    },
    {
      name: 'Capadonna'
    }
  ]
};

app.use(bodyParser.urlencoded());
app.use(expressJWT({ secret: 'wutangclan' }).unless({ path: ['/', '/login', '/wutangclan'] }));



app.get('/', function (req, res) {
  res.send('Hello world\n');
});
app.get('/wutangclan', function (req, res) {
  res.send(killerBeez);
});

app.post('/login', function (req, res) {

  if(!req.body.username || myUsername !== req.body.username) {
    res.status(400).send('username required');
    return;
  }

  let myToken = jwt.sign({username: req.body.username},  '36 chambers');
  res.status(200).json({token: myToken});

});
app.post('/shaolin ', function (req, res) {
  if(req.body.location) {
    killerBeez.location = req.body.location;
    res.status(200).send('location updated');
  } else {
    res.status(400).send('location required');
  }

});
app.listen(PORT, function () {
  console.log(`Example app listening on port ${PORT}!`);
});
你的秘密是‘五堂门’ ,这里呢

let myToken = jwt.sign({username: req.body.username},  '36 chambers');

你的秘密是“36 chambers”

当我试图在我的NodeJS应用程序中集成Auth0身份验证时,我遇到了同样的问题。我使用express jwt模块进行访问令牌身份验证,得到了
无效签名
错误。就我而言,我使用了错误的客户机密。我对创建的应用程序使用了这个秘密,但服务器端的正确秘密必须是API秘密。因此,请检查您的凭据,生成令牌的秘密必须是API的秘密。

您应该保持您的秘密不变,有时会丢失一个单词

exports.signin=(req,res)=>{
    const {email,password}= req.body;

    const errors = validationResult(req);

    if(!errors.isEmpty()){
        return res.status(422).json({
            error: errors.array()[0].msg
        })
    }

    User.findOne({email},(err, user)=>{
        if(err || !user){
            return res.status(400).json({
                error: "user does not exists"
            })
        }

        if(!user.authenticate(password)){
            return res.status(401).json({
                error:"Email and password do not match"
            })
        }

        // create a token

        const token= jwt.sign({_id:user._id}, process.env.SECRET);

        // put a token into a cookie
        res.cookie("token", token,{expire: new Date() + 9999});
        // res.send()

        // response to front end
        const {_id,name, email, role}= user;
        return res.json({token, user: {_id,name,email,role}})

    })
}

// protected routes
exports.isSignedIn = expressJwt({
    
    secret: process.env.SECRET,
    
    userProperty: "auth"
})

我解决了这个问题。我有不匹配的秘密。我有一个“五堂门”和一个“三十六室”的秘密。它们必须是一样的。我在app.post to/shalin的路径中也有一个空格。在解决了这两个问题后,一切正常。
exports.signin=(req,res)=>{
    const {email,password}= req.body;

    const errors = validationResult(req);

    if(!errors.isEmpty()){
        return res.status(422).json({
            error: errors.array()[0].msg
        })
    }

    User.findOne({email},(err, user)=>{
        if(err || !user){
            return res.status(400).json({
                error: "user does not exists"
            })
        }

        if(!user.authenticate(password)){
            return res.status(401).json({
                error:"Email and password do not match"
            })
        }

        // create a token

        const token= jwt.sign({_id:user._id}, process.env.SECRET);

        // put a token into a cookie
        res.cookie("token", token,{expire: new Date() + 9999});
        // res.send()

        // response to front end
        const {_id,name, email, role}= user;
        return res.json({token, user: {_id,name,email,role}})

    })
}

// protected routes
exports.isSignedIn = expressJwt({
    
    secret: process.env.SECRET,
    
    userProperty: "auth"
})