Node.js 中使用 Passport-JWT 实现 JWT 认证

在现代 Web 应用程序开发中,认证和授权是非常重要的组成部分。JWT(JSON Web Token)是一种流行的身份验证机制,它可以在客户端和服务器之间进行安全的身份验证和授权。在本文中,我们将使用 Node.js 和 Passport-JWT 库来实现 JWT 认证。

什么是 JWT?

JWT 是一个基于 JSON 的开放标准(RFC 7519),用于在网络上安全地传输声明。在 JWT 中,声明是由服务器签署的 JSON 对象,然后使用密钥进行加密。这个 JWT 可以在客户端和服务器之间进行传输,并且可以被验证和解密,以便在需要时对用户进行身份验证和授权。

JWT 主要由三个部分组成:

  • Header(头部):包含有关 JWT 的元数据,例如加密算法和类型。
  • Payload(有效载荷):包含有关用户的声明,例如用户名和角色。
  • Signature(签名):用于验证 JWT 是否被篡改。

为什么要使用 Passport-JWT?

Passport 是一个流行的 Node.js 身份验证库,它支持多种身份验证策略,包括本地身份验证、OAuth 和 OpenID 等。Passport-JWT 是 Passport 的一个插件,它提供了对 JWT 身份验证的支持。使用 Passport-JWT,我们可以轻松地验证 JWT 并提供安全的身份验证和授权。

如何使用 Passport-JWT 进行 JWT 认证?

步骤 1:安装 Passport-JWT

首先,我们需要安装 Passport-JWT。使用以下命令来安装:

步骤 2:设置 Passport-JWT 策略

在使用 Passport-JWT 进行身份验证之前,我们需要设置一个策略。在这个策略中,我们需要指定 JWT 的秘钥和其他选项,例如 JWT 的算法和有效期。

const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;

const opts = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: 'your_jwt_secret'
};

passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
  // TODO: validate jwt payload and find user in database
}));

在上面的代码中,我们设置了一个名为 opts 的选项对象,其中包含 JWT 的秘钥和从请求中提取 JWT 的方法。然后,我们使用 passport.use() 方法设置了一个新的 Passport-JWT 策略,该策略将使用 opts 选项进行配置。在策略的回调函数中,我们可以访问 JWT 的有效载荷,并使用它来验证用户并从数据库中查找用户。

步骤 3:使用 Passport-JWT 进行身份验证

现在,我们已经设置了 Passport-JWT 策略,可以在我们的应用程序中使用它来验证 JWT。在路由中,我们可以使用 passport.authenticate() 方法来验证 JWT。

const passport = require('passport');

router.get('/protected', passport.authenticate('jwt', { session: false }), (req, res) => {
  res.json({ message: 'You are authenticated!' });
});

在上面的代码中,我们使用 passport.authenticate() 方法验证 JWT。我们将 'jwt' 作为第一个参数传递,这是我们在步骤 2 中设置的策略名称。我们还将 { session: false } 作为第二个参数传递,以指示 Passport 不应创建会话。

如果 JWT 验证成功,控制权将传递给路由处理程序,否则将返回 401(未经授权)错误。

示例代码

完整的示例代码如下:

const express = require('express');
const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;

const app = express();

// Set up Passport-JWT strategy
const opts = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: 'your_jwt_secret'
};

passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
  // TODO: validate jwt payload and find user in database
}));

// Protected route
app.get('/protected', passport.authenticate('jwt', { session: false }), (req, res) => {
  res.json({ message: 'You are authenticated!' });
});

// Start server
app.listen(3000, () => {
  console.log('Server started on port 3000');
});

总结

在本文中,我们介绍了 JWT 的基本原理和 Passport-JWT 的使用方法。使用 Passport-JWT,我们可以轻松地实现安全的身份验证和授权,从而保护我们的应用程序免受未经授权的访问。希望本文对您有所帮助!

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6589409deb4cecbf2de82d44


纠错
反馈