前言
在 Web 应用中,身份认证是必不可少的一部分。最常见的认证方式就是用户输入账号和密码,服务器根据这些信息查询数据库,验证用户身份是否正确。在使用这种方式时,需要重复验证用户身份,而这可能会浪费一些服务器资源。在这种情况下,使用 JSON Web Tokens (JWT) 可以提供更好的解决方案。
JWT 是一种安全的、可移植的、自包含的、无状态的实体,用于在网络通信中传递声明。JWT 由三部分组成:Header、Payload 和 Signature。其中 Header 存储了 JWT 使用的算法和 Token 类型,Payload 存储了要传递的声明,Signature 使用 Secret Key 进行加密签名,以便在验证时确保该 Token 未被篡改。
在 Node.js 中,我们可以使用 Koa 框架和 Koa-jwt 模块来实现 JWT 验证。
基本使用
安装 koa、koa-router 和 koa-jwt:
npm install koa koa-router koa-jwt
使用 koa-jwt 实现身份认证的示例代码如下:
-- -------------------- ---- ------- ----- --- - -------------- ----- ------ - --------------------- ----- --- - ------------------ ----- --- - --- ----- ----- ------ - --- -------- -- -- --- ------ --- ----- ------ - ----------- -- -------- ------------------- ----- -- - -------- - ------- ----- -- -- ------- ------------------------ ----- ------ --- ----- -- - -------- - ---------- ----- -- ------------------------ ---------------- -- -- - ------------------- -- ------- -- ----------------------- --
当访问 /auth
路由时,页面会直接返回 Public page
。而当访问 /protected
路由时,Koa-jwt 中间件会先验证 JWT 的有效性,如果 Token 验证通过,则页面会返回 Protected page
。
高级用法
自定义错误处理
当 JWT 验证失败时,Koa-jwt 会抛出 401 错误。你可以使用 Koa 自带的错误处理中间件来自定义错误处理。示例代码如下:
-- -------------------- ---- ------- ------------- ----- ----- -- - --- - ----- ------ - ----- ----- - -- ----------- --- ---- - ---------- - --- -------- - -------------- - ---- - ----- --- - - --
自定义 Token 存储位置和名称
默认情况下,Koa-jwt 会从请求头的 Authorization
字段中获取 Token 。你可以使用 Koa-jwt 的 getToken
选项自定义 Token 的获取方式。示例代码如下:
-- -------------------- ---- ------- ----- -------- - ----- -- - --- ----- - ---- -- -------------------------- -- --------------------------------- ----- --- --------- - ----- - --------------------------------- ----- - ---- -- ---------- -- ---------------- - ----- - --------------- - ------ ----- - --------------------------- ----- ------- -------- --- ----- -- - -------- - ------- ------ --
当访问 /custom-token
路由时,Koa-jwt 会从请求头的 Authorization
字段和查询参数 token
中获取 Token。
自定义错误消息
除了自定义错误处理外,你还可以自定义错误消息。示例代码如下:
router.get('/custom-message', jwt({ secret, passthrough: true }), (ctx, next) => { if (ctx.state.user) { ctx.body = 'Custom message' } else { ctx.throw(401, 'Custom error message') } })
当访问 /custom-message
路由时,如果 JWT 验证通过,则页面会返回 Custom message
。否则,页面会返回状态码为 401 的 Custom error message
错误消息。
总结
使用 Koa-jwt 模块可以轻松实现 JWT 验证功能。本文介绍了 Koa-jwt 的基础用法和高级用法,例如自定义错误处理、自定义 Token 存储位置和名称以及自定义错误消息。在开发 Web 应用时,使用 JWT 验证可以避免重复验证用户身份,提高应用程序的性能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6489b2a548841e98947f20e0