
本文详解如何为 web 应用与移动应用设计共享的 restful api,重点说明为何应弃用 $_session、采用 jwt 等无状态认证机制,并提供 php 实现要点与工程实践建议。
在现代全栈架构中,将 Web 前端(如 vue/react)和原生/跨平台移动应用(ios/android)统一接入同一套后端 API,不仅是可行的,更是推荐的最佳实践。关键在于:API 必须是无状态(stateless)的——这意味着它不应依赖服务器端会话(如 php 的 $_session),因为会话机制天然绑定 http 请求上下文、难以横向扩展、且与移动端长连接/后台唤醒等场景不兼容。
✅ 正确做法:使用 JWT(jsON Web Token)实现统一认证
JWT 是一种自包含、可签名、可选加密的轻量级令牌标准(RFC 7519),非常适合跨平台 API 认证:
- 用户登录成功后,服务端生成 JWT(含用户 ID、角色、过期时间等声明),签名后返回给客户端;
- 客户端(Web 或 app)在后续所有 API 请求的 Authorization: Bearer
头中携带该令牌; - 服务端每次收到请求时,仅需验证签名与有效期,即可安全提取用户身份,无需查 session 存储或数据库。
示例(PHP + Firebase JWT 库):
// 登录接口(login.php) use FirebaseJWTJWT; use FirebaseJWTKey; $secret = 'your_32_byte_strong_secret'; $payload = [ 'user_id' => 123, 'email' => 'user@example.com', 'exp' => time() + 3600, // 1小时有效期 'iat' => time() ]; $token = JWT::encode($payload, $secret, 'HS256'); header('Content-Type: application/json'); echo json_encode(['token' => $token]);
// 受保护接口(e.g., /api/chat/messages.php) $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; if (strpos($authHeader, 'Bearer ') !== 0) { http_response_code(401); exit(json_encode(['error' => 'Unauthorized'])); } $token = substr($authHeader, 7); try { $decoded = JWT::decode($token, new Key($secret, 'HS256')); $userId = $decoded->user_id; // ✅ 安全获取当前用户 // 继续业务逻辑:查询聊天记录、发送消息等... } catch (Exception $e) { http_response_code(401); echo json_encode(['error' => 'Invalid or expired token']); }
? 一套 API,服务多端:为什么推荐“统一 API”?
| 维度 | 单一 API(Web + Mobile 共享) | 多套 API(Web API + Mobile API) |
|---|---|---|
| 开发维护成本 | ✅ 逻辑复用率高,bug 修复一次全端生效 | ❌ 重复开发、同步困难、版本碎片化 |
| 安全一致性 | ✅ 统一鉴权、审计、速率限制策略 | ❌ 易出现安全策略不一致漏洞 |
| 运维与监控 | ✅ 日志、指标、链路追踪集中管理 | ❌ 多端埋点分散,排障复杂 |
| 扩展性 | ✅ 水平扩展无 session 粘性问题 | ❌ 多套 API 增加负载与部署复杂度 |
? 提示:可通过请求头(如 X-Client-Type: web/mobile/ios/android)或 URL 路径前缀(如 /api/v1/)做轻量级路由区分,但核心认证、数据模型、业务逻辑层必须统一。
⚠️ 注意事项与进阶建议
- 令牌存储安全:Web 端建议存于 httpOnly + Secure cookie(防 xss);移动端存于安全密钥库(Android Keystore / iOS Keychain),切勿明文存于 localStorage 或 SharedPreferences。
- 刷新机制:JWT 过期后,应配合短期 refresh_token(存于 HttpOnly Cookie 或安全存储)实现静默续期,提升用户体验。
- 权限细化:JWT 中可嵌入 scope 字段(如 “scope”: [“chat:read”, “profile:write”]),结合中间件做细粒度 RBAC 控制。
- 避免 Session 回退陷阱:即使 Web v1 使用 $_SESSION,v2 API 层也绝不应混用——保持分层清晰,新老系统通过 API 解耦。
综上,抛弃 $_SESSION,拥抱 JWT 等无状态认证,不仅满足 Web 与移动 App 的共用需求,更是构建高可用、易演进、符合云原生理念的 API 架构基石。