微信小程序微信授权登录流程总结

893 阅读3分钟

1. 前端授权流程

步骤1:获取微信登录凭证

const { code } = await Taro.login();
  • 调用微信API获取临时登录凭证code
  • code用于后端向微信服务器换取用户的openid和session_key

步骤2:获取用户手机号授权

// 用户点击授权按钮触发
handlePhoneAuth = (e: any) => {
  const { detail } = e;
  if (detail.errMsg === 'getPhoneNumber:ok') {
    // 获取到加密的手机号数据
    // detail.encryptedData - 加密数据
    // detail.iv - 初始向量
  }
}
  • 用户主动点击授权按钮
  • 获取加密的手机号数据(encryptedData和iv) 步骤3:发送授权数据到后端
      <Button
              openType="getPhoneNumber"
              onGetPhoneNumber={AuthManager.handlePhoneAuth}
              className="auth-btn"
            >
              授权手机号登录
    </Button>
            
const result = await Taro.request({
  url: 'https://backend.com/api/v1/auth/login/mini-app',
  method: 'POST',
  data: {
    code,                              // 微信登录凭证
    phone_encrypted_data: phoneData.encryptedData,  // 加密手机号
    phone_iv: phoneData.iv            // 解密向量
  }
});

2. 后端处理流程

后端接收到请求后会:

  1. 使用code向微信服务器换取openid和session_key
  2. 使用session_key解密手机号数据
  3. 生成JWT token并返回

3. API返回数据结构

实际返回数据:

{
  "access_token": "eyJ...",     // JWT访问令牌
  "expires_in": 86400,          // 令牌有效期(秒)
  "refresh_token": "eyJ...",   // 刷新令牌
  "token_type": "Bearer",      // 令牌类型
  "message": "success",        // 响应消息
  "status_code": 200           // 状态码
}

4. 前端存储处理

修改后的存储逻辑:

if (result.data.status_code === 200) {
  const { access_token, refresh_token, expires_in, token_type } = result.data;
  
  // 保存访问令牌
  Taro.setStorageSync('access_token', access_token);
  Taro.setStorageSync('token', access_token); // 兼容旧代码
  
  // 保存刷新令牌
  Taro.setStorageSync('refresh_token', refresh_token);
  
  // 保存令牌过期时间
  const expiresAt = Date.now() + expires_in * 1000;
  Taro.setStorageSync('token_expires_at', expiresAt);
  
  // 保存令牌类型
  Taro.setStorageSync('token_type', token_type);
}

5. 完整授权流程图

用户点击授权按钮
       ↓
获取微信登录code
       ↓
获取手机号加密数据
       ↓
发送到后端API
       ↓
后端解密并生成token
       ↓
前端保存token信息
       ↓
授权完成

6. 关键要点

  1. 用户主动授权 :手机号授权必须用户主动点击按钮触发
  2. 数据加密传输 :手机号以加密形式传输,后端解密
  3. JWT令牌管理 :使用标准OAuth2格式的JWT令牌
  4. 令牌刷新机制 :通过refresh_token可以刷新access_token
  5. 安全性 :所有敏感数据都经过加密处理 这个流程确保了用户隐私安全,同时提供了完整的身份认证机制。

image.png

通过这些方式,授权获取的token信息可以为整个应用提供完整的身份认证、权限控制、数据管理和用户体验优化功能。

💡 总结

简单理解:

  • access_token = 会员卡号
  • refresh_token = 续卡凭证
  • expires_in = 卡的有效期 用途:
  1. 证明"我是谁"
  2. 访问需要登录的功能
  3. 保存个人数据
  4. 使用VIP服务 注意事项:
  • 每次调用API都要带上token
  • 定期检查是否过期
  • 过期前自动刷新
  • 如果刷新失败,就让用户重新登录 就像现实中的会员卡一样,有了这张"数字会员卡",你就能在这个应用里享受各种服务了!