expressjwt的getToken如何使用
expressjwt()
是一个 Express 中间件,用于验证 JWT(JSON Web Tokens)。它会检查请求头中是否存在 Authorization
字段,并且该字段的值是否是符合 JWT 规范的格式。如果 JWT 有效并且签名正确,则它会将 JWT 解码后的负载对象作为 req.auth
对象注入到请求中,并将处理转移给下一个中间件。
在使用 expressjwt()
中间件时,可以传递一些选项来指定 JWT 的配置。其中一个选项是 getToken
函数,它用于从请求中提取 JWT。默认情况下,expressjwt()
将从请求头的 Authorization
字段中提取 JWT,其格式为 Bearer <token>
。但是,您可以通过传递自定义的 getToken
函数来覆盖默认行为。
以下是一个示例,展示如何使用自定义的 getToken
函数:
const expressJwt = require('express-jwt');
const getToken = (req) => {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Custom') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
app.use(expressJwt({
secret: 'mysecret',
algorithms: ['HS256'],
getToken: getToken
}));
在上面的示例中,getToken
函数首先检查请求头中是否存在以 Custom
开头的 Authorization
字段,如果存在则返回该字段中的 token 值。否则,它检查查询参数中是否存在名为 token
的参数,并返回该参数的值。如果都不存在,则返回 null
。
最后,expressjwt()
中间件使用传递的 secret
和 algorithms
来验证 JWT,使用 getToken
函数从请求中提取 JWT。
当您在使用 expressjwt()
中间件时,如果 JWT 验证成功,expressjwt()
会将解码后的负载对象存储在 req.auth
中,并且可以通过该对象访问 JWT 中的字段。请注意,这与 passport-jwt
策略中使用的 req.user
不同。
以下是一个示例,展示如何使用 req.auth
对象:
const expressJwt = require('express-jwt');
app.use(expressJwt({
secret: 'mysecret',
algorithms: ['HS256'],
}));
app.get('/protected', (req, res) => {
console.log(req.auth); // 在控制台输出解码后的负载对象
// 执行受保护的操作
});
在上面的示例中,我们定义了一个路由处理程序,对 /protected
路径进行处理。如果请求中包含有效的 JWT,则 req.auth
将包含解码后的负载对象,我们可以在控制台中查看该对象。否则, req.auth
将为 undefined
。
请注意,如果您希望将解码后的负载对象存储在 req.user
中,您可以通过自定义 getToken
函数的方式来实现。以下是一个示例:
const expressJwt = require('express-jwt');
const getToken = (req) => {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
app.use(expressJwt({
secret: 'mysecret',
algorithms: ['HS256'],
getToken: getToken,
}));
app.use((err, req, res, next) => {
if (err.name === 'UnauthorizedError') {
return res.status(401).json({ message: 'Invalid token' });
}
});
app.get('/protected', (req, res) => {
console.log(req.user); // 在控制台输出解码后的负载对象
// 执行受保护的操作
});
在上面的示例中,我们定义了一个自定义的 getToken
函数,它从请求头的 Authorization
字段中提取 JWT,并将其存储在 req.user
中。在路由处理程序中,我们可以访问 req.user
对象来获取解码后的负载对象。需要注意的是,为了处理 JWT 验证错误,我们还添加了一个错误处理中间件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2022-03-19 openlayers | ol.Overlay实现点击地图图标,图标跳动
2022-03-19 OpenLayers小白入门