tasks.md 5.5 KB

017 任务清单

顺序执行;每步完成后编译验证。

  • T1 数据模型:updatesql/sql.mdinfo_user_oauth 建表(含 uk_provider_uid 唯一索引、idx_user_id)。
  • T2 实体:InfoUserOauth.java@TableName=info_user_oauth,字段 id/userId/provider/providerUid/createTime)。
  • T3 mapper:InfoUserOauthMapper extends BaseMapper<InfoUserOauth>(无 XML)。
  • T4 LoginUserDto 加 provider 字段。
  • T5 JwtUtil.setToken(tokenKey, LoginUserDto) 加 provider claim(非空才写)。
  • T6 配置:application.yml 加 oauth.apple.clientId/jwks-urloauth.google.clientId/tokeninfo-urloauth.line.profile-url
  • T7 依赖:ruoyi-admin/pom.xml 加 nimbus-jose-jwt
  • T8 OAuthVerifyService:verify(provider, credential) → providerUid;Apple(nimbus 验 ES256)、Google(tokeninfo)、LINE(v2/profile),校 audience/iss/exp。
  • T9 DTO:OAuthLoginDto、OAuthBindDto。
  • T10 InfoUserController.oauthLogin:校验→查 oauth→命中签 token / 未命中缓存 tempKey 返 needPhone。
  • T11 InfoUserController.oauthBindPhone:取 providerUid + 验短信→关联/新建→写 oauth→签 token。
  • T12 编译验证(JDK21):ruoyi-admin + ruoyi-system + ruoyi-common。

联调待办(开发提供配置后)

  • 部署环境提供真实 Apple bundleId/clientId、Google clientId,以及 LINE_USER_CLIENT_SECRETLINE_RIDER_CLIENT_SECRETLINE_MERCHANT_CLIENT_SECRET;Secret 不写入仓库。
  • 部署前轮换 Git 历史中曾出现的旧 LINE Channel Secret。
  • 使用真实 Apple、Google、三套 LINE Channel token/code 完成端到端验证(Apple 需真机/测试机 Sign in with Apple)。
  • 三个前端 App 完成登录入口、首次绑手机、provider/回跳 scheme 分流及 i18n 联调。
  • 三端统一升级 state CSRF 协议:服务端签发并单次消费,App 保存发起值并在回跳时比对。

代码评审修复 (2026-07-30)

评审发现并修复(均已 JDK21 编译通过):

  • HTTP 超时OAuthVerifyService.httpGet 原用 HttpClients.createDefault() 无超时,provider 慢/不可达会拖垮请求线程池 → 加 RequestConfig(连接 5s / 读取 10s / 获取连接 5s)。
  • 停用账号拦截oauthBindPhonegetuser(phone) 只滤 del_flag、不滤 status,停用账号(status≠0)能通过三方绑定绕过停用 → 加 status!=0 拦截(与 lodeing / oauthLogin 已绑定路径一致),文案复用 no.user.stop
  • Apple audience:原 aud.get(0) 在多 audience 时可能漏判 → 改 aud.contains(appleClientId)
  • i18n 化(裸中文 → message key):新增 no.oauth.* 共 10 个 key,写入 5 份 properties(messages / zh_CN / zh_TW / en_US / vi);OAuthVerifyService 异常文案与 InfoUserController 提示全部走 MessageUtils.message,与 lodeing 风格一致。新增 key:
    • 控制器:no.oauth.provider.blank / needphone / tempkey.missing / tempkey.expired
    • 校验服务:no.oauth.credential.blank / provider.unsupported / token.invalid / token.expired / audience.mismatch / verify.fail(带 {0} 渠道名;异常详情仅记录在服务端日志,不返回客户端)

用户/骑手/商家 LINE 登录增量(2026-09-04)

  • T13 配置三组 LINE Channel:line_userline_riderline_merchant,共用 token/profile URL,分别配置 redirect URI 和 App scheme。
  • T14 OAuthVerifyService 按 provider 白名单选择对应 Channel ID、Secret、redirect URI,并使用完全相同的 redirect URI 换 token。
  • T15 共用 GET /auth/line/callback,接收 provider/code/state,按 provider 分流验证、绑定查询、token key 和 App 回跳。
  • T16 oauthLogin / oauthBindPhone 支持三个 LINE provider;骑手只绑定 userType=2,商家只绑定 userType=1/3/4/5,均不得自动创建。
  • T17 商家/骑手/子账号统一使用 tel_phone;业务层增加有效账号手机号唯一检查,修改时排除自身,软删除后允许复用。
  • T18 覆盖 addqishouaddshanghuBindingphonesetuser、平台新增/修改、stall/addOwner 及商家子账号新增入口。
  • T19 SQL:先预检 provider 和有效业务账号手机号冲突,再将现有 info_user_oauth.provider='line' 迁移为 line_user,并把业务账号 phone 补入 tel_phone,不清除原字段。
  • T20 更新 LINE 前端接入说明:原授权方式不变,三个端分别增加 provider 参数并使用对应 Channel ID/回跳 scheme。
  • T21 编写并运行定向测试,覆盖 provider 分流、角色限制、手机号唯一规则(2026-09-04:31 tests,0 failures/errors)。
  • T22 使用 JDK 21 编译 ruoyi-commonruoyi-systemruoyi-admin(2026-09-04 reactor package SUCCESS);真实 LINE 端到端联调保留为外部待办。

2026-09-04 另执行完整 reactor test:ruoyi-system 53 tests 全通过,ruoyi-admin 371 tests 中 370 通过、1 error。失败项为既有 PosOrderQsOprateControllerTest.newTasksContainOnlyPaidOrdersWaitingForRiderBeforeMerchantAcceptance 未注入 UserService 导致 NPE,与 017 修改文件及定向测试无关,本次不跨范围修改。

交付记录(2026-09-04):最终代码复核未发现剩余 Critical/Important;git diff --check 通过;数据库迁移未执行,须先运行 updatesql/sql.md 中两项冲突预检再由开发者手工执行;017 修改当前保留在工作区,尚未提交。