Deno框架实战从零构建一个带权限控制的API服务含JWT与中间件设计在现代Web开发中Deno作为Node.js的下一代替代方案凭借其原生支持ES模块、安全沙箱机制和内置工具链正逐渐成为开发者的新宠。本文将带你深入实践Deno JWT 中间件的组合手把手搭建一个具备用户认证与权限校验能力的 RESTful API 服务代码结构清晰、可扩展性强适合生产环境使用。 环境准备确保你已安装最新版 Denov1.30curl-fsSLhttps://deno.land/install/install.sh|sh创建项目目录并初始化mkdirdeno-auth-apicddeno-auth-api deno run --allow-net --allow-read --allow-env server.ts⚠️ 注意--allow-*参数用于开启必要的运行权限实际部署时应细化为最小权限策略。 项目结构建议deno-auth-api/ ├── server.ts # 入口文件 ├── middleware/ │ └── auth.ts # JWT验证中间件 ├── controllers/ │ ├── user.ts # 用户相关逻辑 │ └── admin.ts # 管理员接口需权限 ├── utils/ │ └── jwt.ts # JWT生成/解析工具 └── secrets.json # 存储密钥不提交到Git✅ 核心功能实现JWT权限校验中间件1. JWT 工具封装utils/jwt.tsimport{sign,verify}fromhttps://deno.land/std0.204.0/crypto/jwt.ts;constSECRETDeno.readTextFileSync(secrets.json).trim();exportfunctiongenerateToken(payload:Recordstring,any):string{returnsign(payload,SECRET,HS256);}exportfunctionverifyToken(token:string):Recordstring,any|null{try{returnverify(token,SECRET,HS256)asRecordstring,any;}catch(err){console.error(Token verification failed:,err.message);returnnull;}}### 2. 认证中间件middleware/auth.tstsimport{Context}fromhttps://deno.land/x/oak/mod.ts;import{verifyToken}from../utils/jwt.ts;exportasyncfunctionauthMiddleware(ctx:Context,next:()Promisevoid){constauthHeaderctx.request.headers.get(Authorization);if(!authHeader||!authHeader.startsWith(Bearer )){ctx.response.status401;ctx.response.body{error:Missing or invalid token};return;}consttokenauthHeader.split( )[1];constdecodedverifyToken(token);if(!decoded){ctx.response.status401;ctx.response.body{error:Invalid token};return;}// 将用户信息附加到上下文ctx.state.userdecoded;awaitnext();} 这种设计让你可以在任何控制器中通过ctx.state.user.id获取当前登录用户信息 --- ## 实战案例保护管理员端点 ### 控制器controllers/admin.tstsimport{RouterContext}fromhttps://deno.land/x/oak/mod.ts;exportasyncfunctiongetAdminData(ctx:RouterContext){constuserIdctx.state.user.id;ctx.response.body{message;Welcome, Admin!,userId,timestamp:newDate().toISOString9)};}### 路由注册server.tstsimport{Application,router}fromhttps://deno.land/x/oak/mod.ts;import{authMiddleware}from./middleware/auth.ts;import{getadminData}from./controllers/admin.ts;constappnewApplication();constrouternewRouter();router.get(/admin,authMiddleware,getAdminData).post(/login,async(ctx){const{username,password}awaitctx.request.body9).value;if(usernameadminpasswordsecret){consttokengenerateToken({id:1,role:admin});ctx.response.body{token};}else{ctx.response.status401;ctx.response.body[error:invalid credentials];}});app.use(router.routes9));app.use(router.allowedMethods());console.log( Server running at http;//localhost:8000);awaitapp.listen({port:8000});️ 使用流程图说明请求处理路径伪代码风格[Client Request] ↓ [Router匹配] → /admin ↓ [执行中间件authMiddleware] ├─ 解析Header中的token ├─ 验证有效性 └─ 成功则注入ctx.state.user ↓ [调用getAdminData控制器] ↓ [返回JSON响应] 这个流程天然支持多级中间件组合如日志记录、限流、审计等非常适合复杂业务场景。 --- ## 启动测试终端命令 bash # 启动服务器 deno run --allow-net --allow-read --allow-env server.ts # 登录获取tokenPostman或curl curl -X POST http://localhost:8000/login \ -H Content-Type: application/json \ -d [username:admin,password:secret} # 响应示例 # {token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...}再用该token访问/admin接口curl-HAuthorization: Bearer your-tokenhttp://localhost:8000/admin✅ 成功返回管理员数据失败则401错误提示。 总结为什么选择 Deno特性Node.jsDeno模块系统CommonJS / ES Module需配置原生ES Modules安全模型默认开放所有权限显式权限声明如--allow-net内置工具需要第三方依赖deno fmt,deno lint,deno test原生支持类型友好TS支持良好支持TypeScript开箱即用Deno 不仅是语法上的革新更是开发理念的进化——它让你更专注于业务逻辑本身而不是繁琐的配置和依赖管理。现在就动手试试吧你的下一个微服务也许就在 Deno 上诞生 ✨