身份验证和授权是Web应用程序中安全性的基本资源,可以控制常规对某些系统和系统资源的访问。
在Node.js中,有几种可用的工具可以实现这些功能,例如JWT(JSON Web令牌)和Passport.js。
在本文中,让我们谈谈如何一起使用这些工具,以确保应用程序的安全性和可靠性。
配置环境
在您开始使用JWT和Passport.js之前,我们需要配置我们的开发环境。确保母亲安装了node.js和npm。
然后创建一个新的方向并初始化一个新的node.js项目运行以下命令:
npm init -y
然后使用命令安装以下依赖性:
npm install express jsonwebtoken passport passport-jwt cors
JSON Web令牌(JWT)
JWT是创建访问令牌的开放模式,可用于Web应用程序中的身份验证和授权。
这些令牌是加密的,并包含有关通常的信息,例如名称,电子邮件,权限等。在存储在服务器上的传统会话结束时,JWT令牌存储在客户端的一边,这在可扩展性,性能和安全性方面带来了一些优势。
要生成一个JWT令牌,有必要通过信息信息和秘密键传递给整个JWT.Sign()的秘密键。
示例:
const jwt = require('jsonwebtoken');
const user = {
id: 1,
name: 'John Doe',
email: 'johndoe@example.com',
permissions: ['admin']
};
const token = jwt.sign(user, 'secret-key');
生成的令牌将是可以发送给客户的加密字符串,通常为cookie或http标头。
要验证JWT令牌,只需使用整个JWT.Verify()传递令牌和秘密键:
const decoded = jwt.verify(token, 'secret-key');
母亲返回一个对象,如果令牌是恶意的,则包含令牌中包含的用户信息。如果包含它,将启动一个例外。
Passport.js
Passport.js是Node.js的身份验证中间件,允许我们使用JWT,OAUTH,BASIC AUTH等不同策略进行身份验证使用。 Passport.js还可以处理授权,检查每个用户的权限。
要在应用程序Node.js中使用Passport.js,有必要安装Passport和Passport-JWT软件包:
npm install passport passport-jwt
接下来,有必要设置身份验证策略,以定义Passport.js将如何检查JWT令牌。
示例:
const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const options = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'secret-key'
};
passport.use(new JwtStrategy(options, (payload, done) => {
User.findById(payload.sub)
.then(user => {
if (user) {
return done(null, user);
} else {
return done(null, false);
}
})
.catch(err => done(err, false));
}));
在此示例中,身份验证用于使用整个Extractjwt.fromaethheaderasbearertoken()提取令牌JWT。
创建身份验证路线
要使用JWT和Passport.js在Node.js中创建身份验证路由,必须按照几个步骤进行操作:
1-配置passport.js用于使用JWT(如上所示):
const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const options = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'your_jwt_secret'
};
passport.use(new JwtStrategy(options, (payload, done) => {
// Find the user in the database and return it
// Call done() with an error if the user doesn't exist
done(null, user);
}));
在此示例中,我们将Passport.js设置为从承载身份验证中提取JWT。
©m我们正在定义基于JWT的身份验证的策略。
2-为身份验证创建路由:
const jwt = require('jsonwebtoken');
router.post('/login', (req, res) => {
// Authenticate the user
const user = { id: 1, name: 'John Doe' };
// Generate a JWT
const token = jwt.sign(user, 'your_jwt_secret');
// Return the token to the client
res.json({ token });
});
在此示例中,我们正在对用户进行身份验证并使用整个JWT.Sign()生成JWT令牌。然后,我们以JSON格式将令牌返回给客户。
3-保护需要身份验证的路线:
const passport = require('passport');
router.get('/protected', passport.authenticate('jwt', { session: false }), (req, res) => {
res.json({ message: 'This is a protected route' });
});
在此示例中,我们使用中间件Passport.authenticate()来保护路线 /受保护。
此中间件检查JWT令牌是否徒劳,如果是,则将用户对象添加到对象req。
通过这些步骤,您可以使用JWT和Passport.js在Node.js中创建身份验证路由。
- 记住要保护需要身份验证的路线并安全存储秘密键的路线很重要。
参考:
jwt
Passport
https://www.digitalocean.com/community/tutorials/api-authentication-with-json-web-tokensjwt-and-passport