Express 无Oauth和自定义令牌方案的基于JWT的认证实现
我正在开发一个Web API,在这里我实现了基于JWT的身份验证。我既没有使用PasswordJS middlware也没有使用Oauth协议。它基本上是JWTNPM,我用它来签名和验证令牌 代币的整个概念非常清楚,但我对术语“代币方案”非常困惑,无法理解它的用途 我想了解的是:当令牌被发送回服务器进行进一步请求时,我是否需要使用某种排序或自定义的“JWT”方案并验证它,或者这个概念仅由Oauth使用,而我需要的只是发送普通令牌Express 无Oauth和自定义令牌方案的基于JWT的认证实现,express,authentication,jwt,Express,Authentication,Jwt,我正在开发一个Web API,在这里我实现了基于JWT的身份验证。我既没有使用PasswordJS middlware也没有使用Oauth协议。它基本上是JWTNPM,我用它来签名和验证令牌 代币的整个概念非常清楚,但我对术语“代币方案”非常困惑,无法理解它的用途 我想了解的是:当令牌被发送回服务器进行进一步请求时,我是否需要使用某种排序或自定义的“JWT”方案并验证它,或者这个概念仅由Oauth使用,而我需要的只是发送普通令牌 var accessToken = jwt.sign({
var accessToken = jwt.sign({
userID: user.id,
isAdmin: user.isAdmin
}, config.userSecret, {
expiresIn: 600
});
res.json({
success: true,
user: {
id: user._id,
name: user.name,
username: user.username,
accessToken: 'JWT ' + accessToken,
}
});
jwt.verify(accessToken, secret, function(err, token){...}); //throws error when token is passed with the custom scheme
在这种情况下,您使用的具体方案并不重要,因为您正在手动解析授权头的内容 基本上,令牌是通过一个名为Authorization的HTTP头从客户端发送到服务器的。在令牌前面,您要输入方案的名称。因此,授权标头可能如下所示:
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
允许的名称列表为。对于JWT来说,它通常是不记名的。根据,从技术上讲,您没有遵循OAuth 2.0承载方案,但它通常被称为承载方案
您必须手动获取令牌ey。。。并使用jwt进行验证。验证以获取其有效负载
const headerExists = req.headers.authorization
if (headerExists) {
let token = req.headers.authorization.split(' ')[1];
jwt.verify(token, auth.secretjwtkey, function (err, decoded) {
if (err) {
res.status(HttpStatus.UNAUTHORIZED).json('Unauthorized');
} else if (decoded.role === 'admin') {
next();
} else {
res.status(HttpStatus.UNAUTHORIZED).json('Unauthorized');
}
})
} else {
res.status(HttpStatus.FORBIDDEN).json('No token');
}
从上面的示例中间件可以看出,我不关心授权头上的承载字符串,只关心令牌本身。当然,你可以检查它是否是持票人,而不是其他人
所以这个故事的寓意是:
您可以在授权标头上将令牌从客户端发送到服务器。你必须设置前端,这样才能实现。
您可以在允许列表中的令牌或其中一个令牌前面预先发送承载,但建议使用承载。
您可以通过读取授权头上字符串的第二部分来解码令牌,然后将其提供给jwt.verify。
有关详细信息,请参阅。非常感谢您的详细解释。说得好。