一、需求分析与技术选型
在开发家属端小程序时,登录模块需满足以下核心需求:
- 无感认证:在访问需要授权的页面时自动触发登录流程
- 安全通信:通过HTTPS协议保障数据传输安全
- 会话管理:采用JWT标准实现Token的签发与验证
- 请求拦截:对未授权请求进行统一拦截处理
技术选型方面建议采用:
- 前端:微信原生小程序框架
- 后端:Spring Boot 2.7+ + JWT库
- 安全协议:OAuth2.0简化模式
- 开发工具:微信开发者工具(最新稳定版)
二、开发环境搭建指南
2.1 小程序基础配置
- 账号注册:通过官方平台申请测试账号,获取AppID和AppSecret
- 工具安装:下载安装微信开发者工具,配置开发者权限
- 项目初始化:
# 创建项目目录结构mkdir -p miniprogram/{pages,utils,components}cd miniprogramnpm init -y
2.2 开发工具配置要点
- 网络设置:
- 在「详情」→「本地设置」中启用「不校验合法域名」
- 配置开发服务器地址(需与后端域名一致)
- 安全配置:
- 关闭「ES6转ES5」(现代小程序已支持ES6)
- 启用「上传时压缩代码」
- 环境区分:
- 通过
process.env.NODE_ENV区分开发/生产环境
- 通过
三、登录认证系统实现
3.1 前端登录流程
-
触发条件:
- 在
app.js的onLaunch中检查本地存储的token - 在需要授权的页面
onLoad生命周期中验证
- 在
-
核心代码实现:
// utils/auth.jsconst login = async () => {try {const { code } = await wx.login()const { encryptedData, iv } = await wx.getUserProfile()const res = await wx.request({url: `${baseUrl}/api/auth/login`,method: 'POST',data: { code, encryptedData, iv }})wx.setStorageSync('token', res.data.token)return res.data} catch (error) {console.error('登录失败:', error)throw error}}
3.2 后端认证服务
-
Spring Boot配置:
// 安全配置类@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/api/auth/**").permitAll().anyRequest().authenticated();}}
-
JWT生成逻辑:
public String generateToken(UserDetails userDetails) {Map<String, Object> claims = new HashMap<>();return Jwts.builder().setClaims(claims).setSubject(userDetails.getUsername()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + 86400000)).signWith(SignatureAlgorithm.HS512, secretKey).compact();}
四、全局请求拦截器实现
4.1 拦截器配置
@Configurationpublic class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/auth/**");}}
4.2 拦截逻辑实现
public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {String token = request.getHeader("Authorization");if (StringUtils.isEmpty(token)) {response.sendError(HttpStatus.UNAUTHORIZED.value(), "未授权");return false;}try {Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token.replace("Bearer ", "")).getBody();request.setAttribute("userId", claims.getSubject());return true;} catch (Exception e) {response.sendError(HttpStatus.FORBIDDEN.value(), "无效token");return false;}}}
五、测试与验证方案
5.1 测试用例设计
- 正向测试:
- 正常登录流程验证
- 已登录用户访问受保护接口
- 异常测试:
- 过期token访问
- 篡改token访问
- 无token访问
5.2 调试技巧
-
日志配置:
# application.ymllogging:level:root: INFOorg.springframework.security: DEBUG
-
网络抓包:
- 使用Charles或Fiddler抓取小程序请求
- 验证请求头中的Authorization字段
六、生产环境部署建议
- HTTPS配置:
- 申请正规SSL证书
- 配置Nginx反向代理
- 性能优化:
- 启用Token黑名单机制
- 设置合理的Token有效期
- 安全加固:
- 定期更换签名密钥
- 启用IP白名单限制
通过以上技术方案的实施,开发者可以构建起完整的微信小程序认证体系,实现从用户登录到请求拦截的全流程安全管控。该方案已在多个实际项目中验证,具有高可靠性和可扩展性,特别适合需要快速实现小程序认证功能的开发团队。