【发布时间】:2020-02-28 19:14:46
【问题描述】:
只是尝试使用 Express 服务器对 JSON Web 令牌进行签名和验证的基本实现,但“验证”函数不断返回“无效令牌”错误。
将生成的令牌从“/”路由粘贴到 jwt.io 调试器时,它最初显示“签名无效”,但当我选中“秘密是 base64 编码”复选框时,调试器会验证签名,所以我已经尝试在签名和验证端对我的秘密进行 base64 编码/解码,但没有任何效果。
我目前正在使用名为“REST Client”的 VS 代码扩展名执行请求,它允许您使用“.rest”或“.http”文件发出请求,并且我正在将“Bearer [token]”传递给手动授权标头。我也在使用 Postman 进行测试并收到相同的错误。该应用程序正在按预期通过这两种方法获取标头。
const express = require('express')
const jwt = require('jsonwebtoken')
const app = express()
app.use(express.json())
app.get('/', (req, res) => {
const user = {
username: 'test1234',
email: 'test1234@gmail.com',
admin: false
}
const secret = 'secret'
jwt.sign(user, secret, (err, token) => {
req.token = token
res.send(token)
})
})
app.get('/verify', (req, res) => {
// Bearer <token>
const authHeader = req.headers.authorization
console.log(authHeader)
if(authHeader) {
const token = authHeader.split(' ')[1]
const secret = 'secret'
const userData = jwt.verify(token, secret)
res.send(userData)
} else {
return res.send('Please provide a token.')
}
})
app.listen(3000, () => console.log('Server listening on http://localhost:3000 ...'))
我希望从“/verify”路由返回有效负载 (userData),但会收到“无效令牌”错误。
更新: 问题是我将授权标头的值用引号括起来,例如。授权:“Bearer [token]”,当它不应该用引号引起来时,例如。授权:不记名 [token]。
【问题讨论】:
-
authHeader 在控制台中显示什么?
-
@SuleymanSah "Bearer
",正如变量声明上面的评论中提到的。我目前正在使用名为“REST Client”的 VS 代码扩展名执行请求,该扩展名允许您使用“.rest”或“.http”文件发出请求,并且我正在将“Bearer ”手动传递给授权标头.我也在使用 Postman 进行测试并收到相同的结果。该应用程序正在按预期通过两种方法获取标头。 -
我刚刚在我的本地尝试了这段代码,它工作正常,/路由返回响应正文中的令牌,我在 /verify 中使用该令牌作为授权标头
-
这里是 /verify 路由工作的截图:pasteboard.co/IEZYAoy.png
-
啊!我将 Auth 标头的值作为字符串传递,带有单引号/双引号(授权:“Bearer
”),而它不应该有它们(授权:Bearer )。现在可以了。谢谢@SuleymanSah