开始在 node.js 中使用 JWT
Posted
技术标签:
【中文标题】开始在 node.js 中使用 JWT【英文标题】:Starting to use JWT in node.js 【发布时间】:2020-07-24 00:41:27 【问题描述】:我正在尝试在 node.js
应用程序中使用 JWT
。
我关注了this tutorial。
但是我在中间件层面遇到了问题:
function authenticateToken(req, res, next)
视频中的时间是 10:30。
当我运行代码时,我总是有:
authHeader == null
我尝试了各种方法来为 req.headers['authorization'] 找到其他可能的形式,例如 req.headers.authorization,但无济于事。
我需要说我的应用程序中有一条路由允许我登录,并且我在使用该路由到达中间件之前就使用了该路由。但在任何情况下,authHeader 一直是 null。
我应该怎么做才能确保我得到一个有效的 authHeader 以使应用按照教程中的方式工作并继续前进?
如果这可能有用,这里是中间件功能的完整代码:
function authenticateToken(req, res, next)
// Get the jwt access token from the request header.
const authHeader = req.headers['authorization']
const token = authHeader && authHeader.split(' ')[1]
if (token == null)
console.log('authenticateToken-401')
return res.sendStatus(401)
jwt.verify(token, 'myBigSecret', (err, user) =>
console.log(err)
if (err)
console.log('authenticateToken-403')
return res.sendStatus(403)
req.user = user
next()
)
还有用户登录时运行的代码:
app.post('/login', async function(req, res)
Parse.initialize(process.env.APP_ID);
Parse.serverURL = process.env.SERVER_URL;
Parse.User.logIn(req.body.usrname, req.body.password,
success: user =>
// Let us handle this using JWT.
const jwtUser = name: req.body.usrname
const accessToken = jwt.sign(jwtUser, 'myBigSecret')
res.setHeader("Authorization", 'Bearer '+accessToken);
res.json(accessToken: accessToken)
,
error: (user, error) =>
console.log('Error: '+error);
res.render('pages/login.ejs', );
,
);
);
【问题讨论】:
你能显示你的ajax代码吗? 我没有 Ajax 代码。请让我知道您需要查看代码的哪一部分。 我的意思是你初始化授权的前端代码 看起来你没有在 ajax 调用中设置标题 @Bibek 因为我是第一次尝试 JWT,我并不完全明白你的意思,但我在帖子中添加了处理日志部分的代码;希望这能回答你的问题。 【参考方案1】:您需要在请求中设置标头,看起来您没有在请求中设置标头
【讨论】:
我不记得我在教程中看到过关于设置标题的任何内容,但我可能以某种方式错过了。 你应该如何在不设置的情况下从标题中获取数据【参考方案2】:在上面的登录代码中,您已经使用 jwt 进行了签名,以便客户端应用程序想要访问后端上的一些受限路由时可以使用它 现在,每当客户端想要从前端访问路由时,您需要在 ajax 中将授权令牌设置为标头类似这样的东西
$.ajax(
url: "/apiyouwanttoaccess",
method: "GET",
headers: Authorization: "Bearer " + Cookies.get("token")
)
上面的 ajax 代码应该在您想要访问安全路由的 js 代码附近。 您已经在登录时签署了令牌(第二个代码 sn-p),因此可以通过设置 cookie 在特定用户中使用它
【讨论】:
我明白了,我开始了解它是如何工作的。不过,我还不确定我应该在代码中的哪个位置存储 cookie。 尽管我更改了代码并尝试了几种变体。它仍然无法正常工作。第一个问题是我设置的标头(使用 res.setHeader)似乎从未反映在 authenticateToken 函数中。我暂时还没有设置 cookie。 如果我在设置标头后立即使用 authenticateToken 调用路由,我应该能够在没有 cookie 的情况下进行测试。正确的?但即使这是可能的,我也不完全确定如何调用这条路线来进行测试。 例如登录是一个调用安全路由的按钮,您可以在其中进行 ajax 调用,保留标题,并且登录内可能还有其他页面您想要访问,可以这样做 我明白我需要做什么。请参阅我的帖子“res.setHeader”,在“app.post('/login',...”内)。但它不起作用。这就是问题所在。而且我没有使用 Ajax。以上是关于开始在 node.js 中使用 JWT的主要内容,如果未能解决你的问题,请参考以下文章
Node.js开发指南 BYVoid3.1 开始使用 Node.js编程