跳到正文
Amon
返回
01 NOTE / 编程

飞书工作登录流程

从飞书工作台点击 ERP 应用后,不需要先进入 ERP 登录页再点“飞书登录”,而是自动发起飞书 OAuth 认证。

本文目录
  1. 目标
  2. 最终地址配置
  3. 飞书网页应用主页 / 桌面端主页
  4. 飞书 OAuth 重定向 URL
  5. 工作台进入 ERP 的完整流程
  6. 网页登录页里的“飞书登录”按钮
  7. 未绑定账号时的默认策略
  8. 本次代码分支
  9. 关键代码位置
  10. 验证命令
  11. 排查清单
  12. 经验结论

飞书工作台登录流程个人笔记

个人排查与上线笔记,不属于前端或后端项目仓库。

目标

从飞书工作台点击 ERP 应用后,不需要先进入 ERP 登录页再点“飞书登录”,而是自动发起飞书 OAuth 认证。

同时保留原来的网页登录方式:

  • 用户直接打开 ERP 登录页时,仍然可以手动点击“飞书登录”
  • 用户也可以继续使用账号密码登录
  • 未绑定飞书账号时,不自动放行,回到登录页后由用户账号密码登录,再去个人中心绑定飞书

最终地址配置

飞书网页应用主页 / 桌面端主页

测试环境:

XXX#/feishu-login

生产环境:

XXX#/feishu-login

这个地址负责“发起飞书认证”。

飞书 OAuth 重定向 URL

测试环境:

XXXsocial-callback?source=feishu

生产环境:

XXXsocial-callback?source=feishu

这个地址负责“接收飞书认证结果”。

不要把工作台主页配置成 /social-callback。这个地址需要飞书带回来的 codestate,用户直接访问时没有这些参数,会被当作无效回调并跳回登录页。

工作台进入 ERP 的完整流程

飞书工作台点击应用
→ 打开 /#/feishu-login
→ 前端自动调用 /auth/binding/feishu
→ 后端生成飞书 OAuth 授权地址
→ 浏览器跳转飞书授权
→ 飞书认证完成
→ 飞书回调 /social-callback?source=feishu&code=xxx&state=xxx
→ 前端 SocialCallback 组件处理 code/state
→ 后端用 code 换飞书用户身份
→ 检查 sys_social 是否已有绑定
→ 已绑定:签发 ERP token,进入系统
→ 未绑定:回到 ERP 登录页,提示账号密码登录后去个人中心绑定飞书

网页登录页里的“飞书登录”按钮

这条链路保留不变:

用户打开 ERP 登录页
→ 点击“飞书登录”
→ 调用 /auth/binding/feishu
→ 跳转飞书 OAuth
→ 回调 /social-callback
→ 已绑定则登录,未绑定则回登录页

所以新增 /feishu-login 只是给飞书工作台用,不影响普通网页用户。

未绑定账号时的默认策略

默认仍然是“先绑定,再登录”:

auto-bind: ${FEISHU_AUTO_BIND:false}

不配置 FEISHU_AUTO_BIND=true 时:

  • 已绑定飞书账号:自动登录 ERP
  • 未绑定飞书账号:回 ERP 登录页
  • 用户账号密码登录后,在个人中心绑定飞书
  • 下次再从飞书进入即可自动登录

如果未来要启用自动绑定,需要显式配置:

FEISHU_AUTO_BIND=true

自动绑定的规则是:飞书返回邮箱,并且 ERP 当前租户内存在唯一同邮箱用户。这个开关默认关闭,避免误绑定。

本次代码分支

前后端都使用同名功能分支:

feature/feishu-workbench-login

后端提交:

feat: support feishu SSO binding flow

前端提交:

feat: add feishu workbench login entry

关键代码位置

前端:

  • src/views/feishuLogin/index.vue
    • 飞书工作台自动认证入口
  • src/router/index.ts
    • 注册 /feishu-login
  • src/permission.ts
    • /feishu-login 加入免登录白名单
  • src/layout/components/SocialCallback/index.vue
    • 处理飞书 OAuth 回调
  • src/views/login.vue
    • 保留原登录页飞书按钮,并优化未绑定提示

后端:

  • AuthController.authBinding
    • 生成飞书 OAuth 授权地址
  • SocialAuthStrategy
    • 根据飞书回调登录,并检查 sys_social 绑定关系
  • SysLoginService.socialRegister
    • 写入第三方账号绑定关系
  • application-test.yml / application-prod.yml
    • justauth.type.feishu.auto-bind

验证命令

后端:

mvn -pl soloist-mom-server -am -DskipTests clean compile

前端:

pnpm run build:stage

本地曾遇到 pnpm minimum release age 策略阻止安装依赖,可以临时使用:

$env:CI='true'
pnpm --config.minimum-release-age=0 install --frozen-lockfile
pnpm --config.minimum-release-age=0 run build:stage

这只是本地验证用,不需要提交任何 pnpm 配置或锁文件改动。

排查清单

如果从飞书工作台点击后没有自动进入系统,按顺序检查:

  1. 飞书网页应用主页是否配置为 /mom/#/feishu-login
  2. 飞书重定向 URL 是否配置为 /mom/social-callback?source=feishu
  3. 前端是否已经部署包含 /feishu-login 的构建产物
  4. nginx 是否能把 /mom/social-callback 兜底到 /mom/index.html
  5. index.html 是否能把 /social-callback?xxx 转到 hash 路由
  6. 后端当前 profile 是否为预期环境,例如测试服务器是 test
  7. 当前环境是否配置了飞书 client-idclient-secret
  8. sys_social 是否已有当前飞书账号绑定关系
  9. 如果未绑定,用户是否已账号密码登录后在个人中心绑定飞书
  10. 如果启用了 FEISHU_AUTO_BIND=true,飞书邮箱是否能唯一匹配当前租户 ERP 用户

经验结论

  • /feishu-login 是“发起认证”的入口
  • /social-callback 是“接收认证结果”的回调
  • 两个地址不能混用
  • 工作台无感进入系统,本质还是 OAuth + ERP 自己签发 token
  • 未绑定账号时默认不自动绑定,更符合安全预期
  • 本地没有公网地址时,最省事的测试方式是部署到测试服务器后在飞书开放平台配置测试环境地址