之前的项目是Express,考虑再三还是决定继续沿用之前的技术栈。首先处理的是登录系统,需要实现邮箱登录,手机登录,微信登录,这篇文章只写了邮箱登录。老项目没有使用redis,需要实现这一部分。

一、简介

  • 服务框架:Express(轻量高效的Node.js Web框架,专注接口开发)

  • 数据库:MongoDB(非关系型数据库,适配游戏用户、普通用户数据存储)

  • 数据解析:body-parser(解析前端JSON、表单请求参数)

  • 唯一ID生成:uuid(生成Token、用户唯一玩家ID)

  • 数据加密:自定义工具类MD5加密(密码脱敏存储)

  • 身份认证:内存缓存Token(轻量化无状态登录)

二、设计思路

不适用传统Session+Cookie的登录模式,采用Token无状态认证方案

  1. 用户登录/注册成功后,服务端生成唯一UUID Token作为身份凭证;

  2. 服务端通过内存缓存维护Token与用户信息的映射关系,快速校验身份;

  3. 前端持有Token,后续所有接口请求携带Token完成身份鉴权;

  4. 支持邮箱一键自动注册登录、独立注册、测试快捷登录三种场景;

  5. 统一接口返回格式,全局跨域配置,适配前后端分离开发。

三、功能拆解

1. 基础服务与全局中间件配置

项目初始化后,首先配置全局通用中间件,解决前后端开发核心问题:参数解析与跨域报错。

通过body-parser实现对前端POST请求的JSON、表单数据解析,保证后端可正常获取req.body参数;自定义CORS跨域中间件,放行所有域名、请求头和请求方法,同时处理浏览器OPTIONS预检请求,彻底解决本地调试跨域问题。

2. 数据库连接封装

系统封装了全局数据库实例与懒连接函数ensureDb,核心优势为按需连接、避免资源浪费

服务启动后不会立即连接数据库,仅在执行登录、注册等数据库操作时,先判断连接状态,未连接则自动完成连接,有效避免服务启动耗时过长、数据库无效占用等问题,适配轻量化服务部署。

3. 工具能力封装(核心基础)

为保证系统统一性,封装了三类核心工具方法:

  • Token生成:基于uuid.v4生成随机唯一令牌,作为用户登录凭证;

  • 玩家ID生成:基于uuid.v1去除横杠,生成无重复用户唯一标识,用于业务关联;

  • Token内存缓存:以键值对形式存储Token、用户信息、创建时间,实现高效身份查询,无需每次查询数据库。

4. 接口实现

4.1 邮箱自动注册登录接口

接口地址:POST /api/login/email

核心的业务接口,区别于传统登录系统,可以进行无账号自动注册登录,极大优化用户体验:

  1. 参数校验:校验邮箱、密码非空,正则验证邮箱格式,限制密码最低6位;

  2. 密码脱敏:将前端传入的明文密码通过MD5加密后再校验/存储,杜绝明文存储风险;

  3. 智能分支逻辑:邮箱未注册则自动创建账号、生成昵称并登录;邮箱已注册则校验密码,密码正确更新最后登录时间;

  4. 生成Token并缓存用户信息,统一返回登录结果,区分新用户和老用户登录场景。

4.2 测试快捷登录接口

接口地址:POST /api/login/test

为测试场景设计,输入固定密钥即可快速生成临时测试账号,无需手动注册,大幅提升调试效率。自动创建唯一测试用户,复用登录逻辑生成Token,不影响正式用户数据。

4.3 独立邮箱注册接口

接口地址:POST /api/register,前端暂时留空

提供纯注册能力,校验邮箱唯一性,避免重复注册,支持自定义昵称,注册成功后返回用户基础信息,适配需要先注册、后登录的业务场景,与自动登录接口形成互补。

4.4 Token鉴权查询用户接口

接口地址:GET /api/user/me

前端通过携带Token查询当前登录用户信息,校验Token有效性,实现页面登录态校验、用户信息回显功能,是前端全局身份校验的核心接口。

四、现有方案缺陷与生产级优化方案

4.1 现有短板

  • 内存缓存局限性:Token存储在服务器内存,服务重启后登录态全部失效,多实例部署无法共享登录态;

  • Token无过期机制:当前Token永久有效,存在账号被盗用、长期占用缓存的风险;

  • 安全策略薄弱:仅MD5加密密码(无加盐)、跨域全开、无接口限流、无防刷机制;

  • 异常处理简单:统一返回通用错误信息,不利于线上问题排查。

4.2 生产级优化建议

  1. 缓存升级:将内存缓存替换为Redis,实现Token分布式存储、自动过期、多服务共享登录态;

  2. 增加Token过期机制:配置2小时/24小时过期时间,新增刷新Token接口,保障账号安全;

  3. 密码加密升级:MD5加盐加密或替换为bcrypt加密,避免彩虹表破解;

  4. 安全加固:限制指定域名跨域、添加接口限流、请求参数脱敏、恶意请求拦截;

  5. 日志优化:细分错误日志、操作日志,记录用户登录IP、时间、设备信息,便于问题追溯。

笔者注

因为需求如此不需要继续深入优化,这套基础方案可以应付当前项目,后继使用redis,其他无必要花费精力。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐