即使我在授权中输入令牌,JWT 仍返回无效签名错误
Posted
技术标签:
【中文标题】即使我在授权中输入令牌,JWT 仍返回无效签名错误【英文标题】:JWT Returns Invalid Signature Error Even When I enter the token in Authorization 【发布时间】:2016-05-24 07:40:33 【问题描述】:我已经查看了这个堆栈溢出条目Node.js - Express.js JWT always returns an invalid token error in browser response,但在那里找不到解决方案。
我尝试编写一个小型节点应用程序作为使用 JWT 访问令牌的概念证明。我去了http://jwt.io/ 并尝试跟随视频教程。我已经生成了一个令牌,但是在实际使用该令牌时,我得到一个“UnauthorizedError:无效签名”错误。下面是我的源代码
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!`);
);
【问题讨论】:
我发现了问题所在。我有不匹配的秘密。我有‘武堂门’的秘密和‘三十六室’的秘密。它们都需要相同。我在 app.post 到 /shaolin 的路径中也有一个空格。解决这两个问题后一切正常。 【参考方案1】:我有同样的错误,那是因为 jwt 中的秘密是不同的,当我使两个秘密相同时,我的问题就解决了
【讨论】:
【参考方案2】:你应该保持你的秘密,有时它会漏掉一个字
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"
)
【讨论】:
【参考方案3】:当我尝试将 Auth0 身份验证集成到我的 NodeJS 应用程序中时,我遇到了同样的问题。我使用 express-jwt 模块进行访问令牌身份验证,我得到了 invalid signature
错误。就我而言,我使用了错误的客户端密码。我在创建的应用程序中使用了密码,但服务器端的正确密码必须是 API 密码。所以检查你的凭据,生成令牌的秘密必须是 API 的秘密。
【讨论】:
【参考方案4】:app.use(expressJWT( secret: 'wutangclan' ).unless( path: ['/', '/login', '/wutangclan'] ));
你的秘密是“武当族” , 在这里
let myToken = jwt.sign(username: req.body.username, '36 chambers');
你的秘密是“36 个房间”
【讨论】:
以上是关于即使我在授权中输入令牌,JWT 仍返回无效签名错误的主要内容,如果未能解决你的问题,请参考以下文章
使用刷新令牌时 Spring Boot JWT 令牌无效签名
“AADSTS5002730:无效的 JWT 令牌。 Azure Signal R 服务令牌的代表方案中出现“签名算法的密钥不受支持”错误