随着 Web 应用的发展,用户的密码已经成为了最常用的用户验证方式之一。而那些处理用户帐户、密码重试、第三方验证和社交媒体验证的代码,都是大家无法绕开的痛点。Passport 是一个专为 Node.js 提供的认证中间件,可以便捷地处理用户验证任务。下面,我们将会详细讲解如何在 Koa2 中使用 Passport 实现认证和授权的相关技术。
1. 什么是 Passport?
Passport 是一个 Node.js 身份验证库,旨在提供简单易用、灵活可扩展的框架,来满足 Web 应用中的身份验证需求。 与其他身份验证的不同之处在于它不仅适用于单个 Web 应用程序,还能够用于跨 Web 应用程序共享的 API。
第一个版本的 Passport 的设计理念是插件式模块化,可以用任何一个数据库作为身份验证的资源,而相关的插件库也在不断地更新迭代。因此,开发者可以根据自己的需求轻松地实现类似用户登录、 OAuth 等身份验证功能。
2. 在 Koa2 中使用 Passport
下面,我们将在 Koa2 中使用 Passport 实现基本的认证和授权。
2.1 初步安装
npm install passport npm install passport-local npm install koa-passport
在代码中引入 Passports 模块。
const Passport = require("passport"); const LocalStrategy = require("passport-local").Strategy; const KoaPassport = require("koa-passport");
2.2 基本配置
Passport 首先需要在代码中初始化,使用 .initialize()
即可。
// 初始化 Passport const app = new Koa(); app.use(Passport.initialize()); app.use(Passport.session());
2.3. KoaPassport 配置
KoaPassport.serializeUser((user, done) => { done(null, user.id); }); KoaPassport.deserializeUser(async (id, done) => { const user = await User.findById(id); return done(null, user); });
2.4 用户验证策略
Passport 采用策略模式设计。我们需要自己设计一个策略类,并配置到 Passport 实例里面。这里我们使用最常考虑的本地策略 local
进行用户名密码认证。
-- -------------------- ---- ------- ------------- --- ------------------- ---------- --------- ----- -- - ----- ---- - ----- -------------- --------- -------- --- -- ------- - ------ ---------- ------ - -------- ---------- --------- --- - -- ---------------------------------- - ------ ---------- ------ - -------- ---------- --------- --- - ------ ---------- ------ -- --
2.5 用户认证
在 Koa2 中本地认证时,用户将用户名和密码发送给服务器,而服务器则通过 req.body.username
和 req.body.password
访问数据。Passport 提供了用于处理基本身份验证流程的中间件功能。
-- -------------------- ---- ------- ----- ------ - ---------------------- ----- ------ - --- --------- ------------ --------- --------------------------------- - ---------------- ------------------- ---------------- --------- -- --
authenticate()
函数将会按照预设的策略调用并等待策略返回结果。如果策略成功则会将用户状态存入 TTY 会话,或者其他需要的方式,可以自行设置。既然策略已经被定义,那就可以在控制器方法中通过中间件函数来应用该策略。
2.6 路由权限
router.get( "/users", KoaPassport.authenticate("jwt", { session: false }), async (ctx, next) => { let users = await User.find(); ctx.body = users; } );
这个路由保护,在调用 api 的时候需要提供 Authorization
头,请求的源由服务器判断,如果在策略中定义的认证方式是 Bearer
则需要传入以下格式:Bearer {token}
3. 总结
Passport 是一个强大、灵活的身份验证库,可以轻松地实现身份验证和授权的任务。学习使用 Passport 可以让我们更加了解身份验证的基础知识,对编写更高效、流程更简单的 Web 应用程序有很大的帮助。
在本文中我们介绍了如何在 Koa2 中使用 Passport 实现认证和授权,希望这篇文章能够帮助到您。如果您有任何疑问或建议,请随时在评论区中留言。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65ac63afadd4f0e0ff5f9b4a