Node.js游戏服务器项目移植 6-轻量化Token登录概述
之前的项目是Express,考虑再三还是决定继续沿用之前的技术栈。首先处理的是登录系统,需要实现邮箱登录,手机登录,微信登录,这篇文章只写了邮箱登录。老项目没有使用redis,需要实现这一部分。
一、简介
服务框架:Express(轻量高效的Node.js Web框架,专注接口开发)
数据库:MongoDB(非关系型数据库,适配游戏用户、普通用户数据存储)
数据解析:body-parser(解析前端JSON、表单请求参数)
唯一ID生成:uuid(生成Token、用户唯一玩家ID)
数据加密:自定义工具类MD5加密(密码脱敏存储)
身份认证:内存缓存Token(轻量化无状态登录)
二、设计思路
不适用传统Session+Cookie的登录模式,采用Token无状态认证方案
用户登录/注册成功后,服务端生成唯一UUID Token作为身份凭证;
服务端通过内存缓存维护Token与用户信息的映射关系,快速校验身份;
前端持有Token,后续所有接口请求携带Token完成身份鉴权;
支持邮箱一键自动注册登录、独立注册、测试快捷登录三种场景;
统一接口返回格式,全局跨域配置,适配前后端分离开发。
三、功能拆解
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
核心的业务接口,区别于传统登录系统,可以进行无账号自动注册登录,极大优化用户体验:
参数校验:校验邮箱、密码非空,正则验证邮箱格式,限制密码最低6位;
密码脱敏:将前端传入的明文密码通过MD5加密后再校验/存储,杜绝明文存储风险;
智能分支逻辑:邮箱未注册则自动创建账号、生成昵称并登录;邮箱已注册则校验密码,密码正确更新最后登录时间;
生成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 生产级优化建议
缓存升级:将内存缓存替换为Redis,实现Token分布式存储、自动过期、多服务共享登录态;
增加Token过期机制:配置2小时/24小时过期时间,新增刷新Token接口,保障账号安全;
密码加密升级:MD5加盐加密或替换为bcrypt加密,避免彩虹表破解;
安全加固:限制指定域名跨域、添加接口限流、请求参数脱敏、恶意请求拦截;
日志优化:细分错误日志、操作日志,记录用户登录IP、时间、设备信息,便于问题追溯。
笔者注
因为需求如此不需要继续深入优化,这套基础方案可以应付当前项目,后继使用redis,其他无必要花费精力。
