1.使用 JWT 实现注册与登录
2.vscode server源码解析(三) - code server
使用 JWT 实现注册与登录
本文将带领大家完成使用 JWT 实现注册与登录的小实战。首先,登录登录我们创建一个 user 模块并生成 user 实体,功能功包含 uuid,模块模块 用户名, 密码, 头像, 邮箱等字段。注册的源码源码实现涉及新增用户,通过在 user 控制器中规定一个路由/user/register 来接收参数,注册注册网页app源码下载并在 user 服务中实现注册逻辑。登录登录我们首先判断用户是功能功否存在,若存在则抛出业务异常返回给前端;若不存在,模块模块则向数据库添加一条数据。源码源码启动项目并使用 apifox 模拟注册请求,注册注册数据添加成功后,登录登录可以看到 user 表中已包含注册的功能功用户数据。
在实际项目中,模块模块密码通常需要进行加密,源码源码并在数据库中保存加密后的问题网页源码密码。为此,我们可以利用 crypto 进行密码加密,首先安装 crypto。然后,新建 src/utils/crypto.ts 文件,编写一个加密工具函数,使用 sha 算法对密码进行加密。这个加密步骤应该在服务中插入数据库之前对密码进行加密,或者在 user 实体中数据库实例中添加装饰器 BeforeInsert 来执行插入数据库之前的操作。这里还保存了加密所需的 salt,以便在登录时使用此 salt 对密码进行加密与数据库中的密码进行对比。测试加密后,插入的密码已进行加密。
接下来,我们创建登录流程,idea sprng源码用户输入用户名和密码,后端根据用户名获取用户盐和加密后的密码,使用 salt 对用户输入的密码进行加密,比较加密后的密码是否一致。登录成功后,后端会生成一个限时的 token 返回给前端。前端获取 token 并缓存,后续需要登录验证的接口都添加带有 token 的请求头,后端根据请求头的 token 来决定是否放行。
在 Nest 中,我们安装 @nestjs/jwt 并在.env 文件中配置 JWT 密钥。生成一个 auth 模块来处理登录逻辑,导入 JWT 模块和 user 模块,以便调用 user 模块的方法。使用工厂模式导入 JwtModule,深入mybatis源码从 ConfigService 获取.env 中的值。定义 auth/login 接口并调用 user 模块中的查询用户信息的方法。在 auth 服务中写登录逻辑,首先判断用户是否存在,然后使用 salt 对密码进行加密比较,生成 token 并返回给前端。测试接口时,获取到返回的 token。
使用 guard 验证 token 的有效性。我们创建一个 auth 守卫 auth.guard.ts,定义当返回 true 时放行,否则拦截的逻辑,用于验证 token。通过装饰器 UseGuards,在 auth 控制器中定义测试接口,apioperation注解源码验证 token 有效性。不加 token 请求时验证未通过,添加 token 后验证通过。
为简化验证流程,我们可以将守卫改造为全局守卫。在 auth 模块中引入 APP_GUARD 并注入 AuthGuard,使其成为全局守卫。移除 auth 控制器中的装饰器 UseGuards,发现守卫依然有效。通过 @Public 装饰器设置元数据 isPublic 为 true,表示接口不需验证登录,如注册和登录接口。在 auth 守卫中通过 Reflector 取出当前接口的 isPublic,为 true 则直接放行。
至此,NestJS 的登录注册功能基本完成。尽管篇幅有限,本文未详细讲解涉及的全部内容。欢迎关注专栏 Vue3+NestJS 全栈开发后台权限管理系统,后续将进行更新。完整源码已提供。
vscode server源码解析(三) - code server
初次接触code server,可参考介绍文章。整体架构不清晰时,建议阅读架构分析。
在深入分析code server代码之前,先理解code server在远程开发中的作用。code server作为服务器的核心功能,提供远程IDE访问,基于express框架和nodejs平台构建,实现了轻量级服务器的基础。此外,它提供用户登录功能,确保安全访问,并在登录后加载vscode server内核代码。
code server还具备升级、代理和心跳检测等功能,但这些细节在此不作深入探讨。
本文将重点解析code server的启动机制、提供服务的实现方式、中间件和路由设计,以及如何启动vscode内核。
code server的启动通过src/node/entry.ts文件实现,启动命令为`code-server`。实际上,这只是一个shell脚本,通过`node`命令启动程序。在package.json中定义了启动逻辑。
程序启动时,会检查当前进程是否为子进程,进而决定执行的启动方式。父进程负责管理整个软件,启动子进程并控制其生命周期,以及与子进程通信,比如接收日志输出。子进程则作为真正的express框架服务器,加载vscode server内核代码。
运行代码通过`runCodeServer`方法启动,首先通过`createApp`创建服务器,监听指定的主机和端口。`handleUpgrade`方法处理websocket连接,这是vscode server前后端通信的关键。详细说明将单独撰写。
路由和中间件是code server的核心部分。路由定义了服务器提供的接口,如GET和POST,供前端调用。中间件则负责处理请求前后的预处理和后处理工作,如鉴权,注册到express框架中。
code server中的`register`方法处理路由和中间件逻辑,将请求分发到不同的路由,如`/login`和`/health`,每个路由包含各自的中间件处理请求。
关于vscode server内核的启动,主要通过`src/node/routes/vscode.ts`文件实现。在经过鉴权等路由处理后,请求到达特定路由。`ensureCodeServerLoaded`中间件负责加载vscode代码。`loadAMDModule`执行原生vscode启动过程,引入模块。加载完成后,可以获得`createVSServer`方法,用于真正启动vscode内核。
至此,code server的基本功能实现完毕。接下来将深入探讨vscode server内核和websocket协议。