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 验证错误,我们还添加了一个错误处理中间件。
箴言:因为这些东西是非常简单的。不要抱怨自己学不会,那是因为你没有足够用心。