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. 后端处理流程
后端接收到请求后会:
- 使用code向微信服务器换取openid和session_key
- 使用session_key解密手机号数据
- 生成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. 关键要点
- 用户主动授权 :手机号授权必须用户主动点击按钮触发
- 数据加密传输 :手机号以加密形式传输,后端解密
- JWT令牌管理 :使用标准OAuth2格式的JWT令牌
- 令牌刷新机制 :通过refresh_token可以刷新access_token
- 安全性 :所有敏感数据都经过加密处理 这个流程确保了用户隐私安全,同时提供了完整的身份认证机制。
通过这些方式,授权获取的token信息可以为整个应用提供完整的身份认证、权限控制、数据管理和用户体验优化功能。
💡 总结
简单理解:
- access_token = 会员卡号
- refresh_token = 续卡凭证
- expires_in = 卡的有效期 用途:
- 证明"我是谁"
- 访问需要登录的功能
- 保存个人数据
- 使用VIP服务 注意事项:
- 每次调用API都要带上token
- 定期检查是否过期
- 过期前自动刷新
- 如果刷新失败,就让用户重新登录 就像现实中的会员卡一样,有了这张"数字会员卡",你就能在这个应用里享受各种服务了!