跳转到主要内容

Documentation Index

Fetch the complete documentation index at: https://docs.profy.cn/llms.txt

Use this file to discover all available pages before exploring further.

认证系统

Profy 采用 SMS 验证码 + JWT Token 的无密码认证方案,通过 Redis 实现会话管理和单设备策略。针对第三方集成,提供基于 API Key 的 OpenAPI 认证通道。

概述

SMS 验证码登录

登录流程

关键设计

  • 无密码 — 手机号即身份,验证码即凭证,无需记忆密码
  • 自动注册 — 首次登录自动创建用户和金币账户
  • 频率限制 — Redis 控制同一手机号的发送间隔,防止滥用

JWT Token 管理

Token 签发

使用 @profy/auth 包(基于 jose 库)签发 HS256 JWT:
signToken(userId: string, secret: string, expiresIn?: string)
// 默认有效期 7 天
// Payload: { sub: userId, iat, exp }

Redis 会话存储

Token 不仅作为无状态 JWT 存在,同时在 Redis 中维护一份会话记录:
Redis KeyValueTTL
auth:token:{token}{userId, phone}86400s(24h)
auth:user-token:{userId}token86400s(24h)
每次 API 请求命中 Auth Filter 时,TTL 会被刷新(滑动过期),活跃用户不会被踢出。

单设备策略

每次登录生成新 Token 并写入 auth:user-token:{userId},覆盖旧值。旧 Token 在 Redis 中的 auth:token:{oldToken} 仍然存在直到 TTL 过期,但 Auth Filter 会通过校验 auth:user-token:{userId} 确保只有最新 Token 有效。

Auth Filter 中间件

Auth Filter 应用于所有 /api/* 路由,是 Core API 的安全屏障。

处理流程

白名单路由

以下路由跳过认证,直接放行:
路由说明
/api/auth/login登录接口
/api/auth/sms/sendCode发送验证码
/api/health健康检查
/api/payment/notify/*支付回调(微信/支付宝)
/api/market/*市场公开浏览接口

Token 提取优先级

  1. Authorization: Bearer {token} 请求头
  2. Cookie 中的 token 字段

API Key 认证

针对第三方系统集成,Profy 提供基于 API Key 的认证方式,用于 /openapi/* 路由。

API Key 管理

方法路径说明
POST/api/user/apiKey/create创建 API Key
POST/api/user/apiKey/list列出用户的 API Key
POST/api/user/apiKey/delete删除 API Key
API Key 以 sk_ 前缀标识,存储在 Redis openapi:key:{key} 中用于快速验证。

OpenAPI 路由

方法路径说明
GET/openapi/coin/balance查询余额
POST/openapi/coin/consume消费金币
POST/openapi/coin/preCheck预检余额

Key Filter 处理

Next.js 通过两个专用端点管理认证 Cookie:
方法路径说明
POST/api/auth/session设置 profy_token HttpOnly Cookie
DELETE/api/auth/session清除 Cookie(登出)
Expert 路由(/claw/*)受 proxy.ts 中间件保护,无 Cookie 自动重定向到登录页。

Expert Auth 桥接

Expert 的 Next.js API 路由需要获取当前用户身份,通过 getAuthUserId() 实现:
  1. profy_token Cookie 或 Bearer Header 提取 Token
  2. 内存缓存查询(TTL 5 分钟)
  3. 缓存未命中则调用 Core /api/auth/userinfo 验证
  4. 返回 userId 供 Expert API 使用

安全实践

措施说明
HS256 JWT对称签名,服务端独占密钥
Redis 会话支持即时失效,不依赖 JWT 过期
滑动过期活跃用户 Token TTL 自动延长
单设备新登录自动踢出旧设备
HttpOnly Cookie防止 XSS 窃取 Token
频率限制SMS 发送间隔限制防刷
内网隔离/internal/* 仅限内网访问

相关链接

系统架构

Auth Filter 在请求链路中的位置

金融支付

OpenAPI 金币操作需要 API Key 认证