微信小程序与后端集成开发:登录认证与请求拦截全流程解析

一、需求分析与技术选型

在开发家属端小程序时,登录模块需满足以下核心需求:

  1. 无感认证:在访问需要授权的页面时自动触发登录流程
  2. 安全通信:通过HTTPS协议保障数据传输安全
  3. 会话管理:采用JWT标准实现Token的签发与验证
  4. 请求拦截:对未授权请求进行统一拦截处理

技术选型方面建议采用:

  • 前端:微信原生小程序框架
  • 后端:Spring Boot 2.7+ + JWT库
  • 安全协议:OAuth2.0简化模式
  • 开发工具:微信开发者工具(最新稳定版)

二、开发环境搭建指南

2.1 小程序基础配置

  1. 账号注册:通过官方平台申请测试账号,获取AppID和AppSecret
  2. 工具安装:下载安装微信开发者工具,配置开发者权限
  3. 项目初始化
    1. # 创建项目目录结构
    2. mkdir -p miniprogram/{pages,utils,components}
    3. cd miniprogram
    4. npm init -y

2.2 开发工具配置要点

  1. 网络设置
    • 在「详情」→「本地设置」中启用「不校验合法域名」
    • 配置开发服务器地址(需与后端域名一致)
  2. 安全配置
    • 关闭「ES6转ES5」(现代小程序已支持ES6)
    • 启用「上传时压缩代码」
  3. 环境区分
    • 通过process.env.NODE_ENV区分开发/生产环境

三、登录认证系统实现

3.1 前端登录流程

  1. 触发条件

    • app.jsonLaunch中检查本地存储的token
    • 在需要授权的页面onLoad生命周期中验证
  2. 核心代码实现

    1. // utils/auth.js
    2. const login = async () => {
    3. try {
    4. const { code } = await wx.login()
    5. const { encryptedData, iv } = await wx.getUserProfile()
    6. const res = await wx.request({
    7. url: `${baseUrl}/api/auth/login`,
    8. method: 'POST',
    9. data: { code, encryptedData, iv }
    10. })
    11. wx.setStorageSync('token', res.data.token)
    12. return res.data
    13. } catch (error) {
    14. console.error('登录失败:', error)
    15. throw error
    16. }
    17. }

3.2 后端认证服务

  1. Spring Boot配置

    1. // 安全配置类
    2. @Configuration
    3. @EnableWebSecurity
    4. public class SecurityConfig extends WebSecurityConfigurerAdapter {
    5. @Override
    6. protected void configure(HttpSecurity http) throws Exception {
    7. http.csrf().disable()
    8. .authorizeRequests()
    9. .antMatchers("/api/auth/**").permitAll()
    10. .anyRequest().authenticated();
    11. }
    12. }
  2. JWT生成逻辑

    1. public String generateToken(UserDetails userDetails) {
    2. Map<String, Object> claims = new HashMap<>();
    3. return Jwts.builder()
    4. .setClaims(claims)
    5. .setSubject(userDetails.getUsername())
    6. .setIssuedAt(new Date())
    7. .setExpiration(new Date(System.currentTimeMillis() + 86400000))
    8. .signWith(SignatureAlgorithm.HS512, secretKey)
    9. .compact();
    10. }

四、全局请求拦截器实现

4.1 拦截器配置

  1. @Configuration
  2. public class InterceptorConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addInterceptors(InterceptorRegistry registry) {
  5. registry.addInterceptor(new AuthInterceptor())
  6. .addPathPatterns("/api/**")
  7. .excludePathPatterns("/api/auth/**");
  8. }
  9. }

4.2 拦截逻辑实现

  1. public class AuthInterceptor implements HandlerInterceptor {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request,
  4. HttpServletResponse response,
  5. Object handler) throws Exception {
  6. String token = request.getHeader("Authorization");
  7. if (StringUtils.isEmpty(token)) {
  8. response.sendError(HttpStatus.UNAUTHORIZED.value(), "未授权");
  9. return false;
  10. }
  11. try {
  12. Claims claims = Jwts.parser()
  13. .setSigningKey(secretKey)
  14. .parseClaimsJws(token.replace("Bearer ", ""))
  15. .getBody();
  16. request.setAttribute("userId", claims.getSubject());
  17. return true;
  18. } catch (Exception e) {
  19. response.sendError(HttpStatus.FORBIDDEN.value(), "无效token");
  20. return false;
  21. }
  22. }
  23. }

五、测试与验证方案

5.1 测试用例设计

  1. 正向测试
    • 正常登录流程验证
    • 已登录用户访问受保护接口
  2. 异常测试
    • 过期token访问
    • 篡改token访问
    • 无token访问

5.2 调试技巧

  1. 日志配置

    1. # application.yml
    2. logging:
    3. level:
    4. root: INFO
    5. org.springframework.security: DEBUG
  2. 网络抓包

    • 使用Charles或Fiddler抓取小程序请求
    • 验证请求头中的Authorization字段

六、生产环境部署建议

  1. HTTPS配置
    • 申请正规SSL证书
    • 配置Nginx反向代理
  2. 性能优化
    • 启用Token黑名单机制
    • 设置合理的Token有效期
  3. 安全加固
    • 定期更换签名密钥
    • 启用IP白名单限制

通过以上技术方案的实施,开发者可以构建起完整的微信小程序认证体系,实现从用户登录到请求拦截的全流程安全管控。该方案已在多个实际项目中验证,具有高可靠性和可扩展性,特别适合需要快速实现小程序认证功能的开发团队。