微信小程序与后端集成开发全解析:登录、Token加密与拦截器实践

一、需求分析与技术选型

在开发微信小程序登录功能前,需明确核心业务场景:当用户访问需要授权的页面时,系统需自动检测登录状态,未登录用户将被引导至微信授权页面完成身份验证。典型场景包括:

  1. 敏感数据访问:如用户个人信息、订单记录等
  2. 支付功能集成:涉及资金交易的操作
  3. 个性化服务:根据用户身份展示定制化内容

技术选型方面,推荐采用JWT(JSON Web Token)作为身份认证凭证,其自包含特性可减少服务端查询压力。后端建议使用Spring Boot框架构建RESTful API,配合拦截器实现统一认证管理。

二、开发环境搭建指南

2.1 微信小程序配置

  1. 测试账号申请:通过官方开发者平台申请测试号,获取AppID和AppSecret
  2. 开发工具安装:下载最新版开发者工具,支持Windows/macOS双平台
  3. 项目导入流程
    • 解压项目代码包
    • 扫码登录开发者工具
    • 选择”导入项目”并配置AppID
    • 信任开发证书(首次运行需确认)

2.2 开发工具优化设置

  1. 网络配置
    • 修改project.config.json中的后端接口地址
    • 在详情面板开启”不校验合法域名”(仅开发环境)
  2. 性能优化
    • 关闭ES6转ES5(提升编译速度)
    • 禁用上传时源码映射(减少包体积)
  3. 安全策略
    • 配置request合法域名(生产环境必须使用HTTPS)
    • 设置web-view业务域名

三、Spring Boot后端实现

3.1 安全配置调整

SecurityConfig类中放行小程序相关接口:

  1. @Configuration
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  3. @Override
  4. protected void configure(HttpSecurity http) throws Exception {
  5. http.authorizeRequests()
  6. .antMatchers("/api/wx/**").permitAll() // 放行小程序接口
  7. .anyRequest().authenticated();
  8. }
  9. }

3.2 登录接口实现

核心流程包含三步:

  1. 获取微信code:前端调用wx.login()获取临时登录凭证
  2. 交换session_key:后端通过code向微信服务器请求用户唯一标识
  3. 生成JWT:结合用户信息生成加密Token

示例代码:

  1. @PostMapping("/api/wx/login")
  2. public ResponseEntity<?> wxLogin(@RequestBody WxLoginRequest request) {
  3. // 1. 向微信服务器请求session_key
  4. String url = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code="
  5. + request.getCode() + "&grant_type=authorization_code";
  6. // 2. 解析响应获取openid和session_key
  7. WxSessionResponse session = restTemplate.getForObject(url, WxSessionResponse.class);
  8. // 3. 生成JWT(使用HS256算法)
  9. String token = Jwts.builder()
  10. .setSubject(session.getOpenid())
  11. .setIssuedAt(new Date())
  12. .setExpiration(new Date(System.currentTimeMillis() + 86400000))
  13. .signWith(SignatureAlgorithm.HS256, "your-secret-key".getBytes())
  14. .compact();
  15. return ResponseEntity.ok(new LoginResponse(token));
  16. }

四、全局拦截器实现

4.1 拦截器配置

创建AuthInterceptor实现HandlerInterceptor接口:

  1. public class AuthInterceptor implements HandlerInterceptor {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  4. // 1. 排除登录接口
  5. if (request.getRequestURI().startsWith("/api/wx/login")) {
  6. return true;
  7. }
  8. // 2. 获取Authorization头
  9. String token = request.getHeader("Authorization");
  10. if (token == null || !token.startsWith("Bearer ")) {
  11. response.setStatus(HttpStatus.UNAUTHORIZED.value());
  12. return false;
  13. }
  14. // 3. 验证Token有效性
  15. try {
  16. Claims claims = Jwts.parser()
  17. .setSigningKey("your-secret-key".getBytes())
  18. .parseClaimsJws(token.replace("Bearer ", ""))
  19. .getBody();
  20. request.setAttribute("userId", claims.getSubject());
  21. return true;
  22. } catch (Exception e) {
  23. response.setStatus(HttpStatus.UNAUTHORIZED.value());
  24. return false;
  25. }
  26. }
  27. }

4.2 拦截器注册

在配置类中注册拦截器并指定拦截路径:

  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addInterceptors(InterceptorRegistry registry) {
  5. registry.addInterceptor(new AuthInterceptor())
  6. .addPathPatterns("/api/**") // 拦截所有API接口
  7. .excludePathPatterns("/api/public/**"); // 排除公开接口
  8. }
  9. }

五、前后端联调测试

5.1 测试用例设计

  1. 正常流程测试

    • 前端调用登录接口获取Token
    • 携带Token访问受保护接口
    • 验证接口返回正确数据
  2. 异常场景测试

    • 使用过期Token访问接口
    • 篡改Token内容
    • 不携带Token访问接口

5.2 性能优化建议

  1. Token缓存策略

    • 使用Redis存储Token黑名单
    • 设置合理的Token过期时间
  2. 接口限流设计

    • 对登录接口实施限流(如10次/分钟)
    • 防止暴力破解攻击
  3. 日志监控体系

    • 记录所有认证失败请求
    • 设置异常登录告警阈值

六、安全增强方案

  1. 敏感数据加密

    • 对用户手机号等敏感信息进行AES加密存储
    • 数据库字段使用char(32)存储加密结果
  2. 防重放攻击

    • 在JWT中添加时间戳和随机数
    • 服务端验证请求时间窗口
  3. CSRF防护

    • 在关键接口添加Referer校验
    • 使用SameSite Cookie属性

通过以上技术方案,开发者可构建一个安全可靠的微信小程序登录系统。实际开发中需根据业务需求调整安全策略,建议定期进行安全审计和渗透测试,确保系统持续符合安全合规要求。对于高并发场景,可考虑引入分布式会话管理方案,进一步提升系统扩展性。