Files
sso-portal/README.md
zhangheng 775b4f6044 chore(sso-portal): 整合近期重构、UX 改进、部署脚本与文档
项目改名 sso-mock → sso-portal:
- 重命名仓库目录 sso-mock/ → sso-portal/
- package.json name 改 sso-portal
- app/layout.tsx title/description 改 SSO Portal
- 源码 [sso-mock] console.log 前缀、注释全部 → [sso-portal]
- 文档(README、ADAPTATION_GUIDE)、env 同步
- 生产 svc 名 sso-mock-svc → sso-portal-svc(external-app 引用同步)

SSO tenant 改环境变量驱动:
- 新增 SSO_TENANT env(默认 cowarobot)
- login/route.ts 顶部 const SSO_TENANT,ssoBody 显式使用
- callSsoApi 改回纯透传(不再硬编码覆盖 tenant)
- external-app 同步用 SSO_TENANT,命名对齐

external-app 登录态改为基于 token:
- page.tsx 读 token cookie 判定 authenticated(不再依赖 user cookie)
- DashboardPage 用 authenticated 决定跳转,user 为 null 时优雅兜底展示
- 解决「200 后又跳回 SSO」bug(access_token 接口不返回 user)

sso-portal 缺 SSO 参数体验优化:
- 缺 app_id/app_url 时 Alert 提示 + 禁用所有输入和登录按钮
- components/login/index.tsx 加 missingSsoParams 检测
- Alert 样式两排完整显示

部署脚本(参考 uirefbase):
- 新增 build.sh(git → pnpm install → build → docker build → tag → push)
- 新增 .gitlab-ci.yml(main 分支触发 build.sh prod)
- 新增 Dockerfile(standalone 模式,端口 5501)
- package.json 加 env-cmd 依赖 + build:stage/build 脚本
- next.config.ts 保持 output: 'standalone'

代码清理:
- 删除 utils/code-store.ts
- 删除 app/api/auth/verify/(连同目录)
- 移除旧的 codeStore / generateCode 逻辑

文档:
- ADAPTATION_GUIDE.md:完整重写对齐真实后端三个 SSO 接口(/sso/account、/sso/phone/smscode、/sso/access_token)
- 新增 INTEGRATION_GUIDE.md(从 external-app 迁移过来作为通用接入指南)
- README.md 同步更新(sso-portal 仓库门面 + 文档索引)
- external-app/README.md 加交叉链接指向 sso-portal 的接入文档
2026-07-08 20:53:51 +08:00

3.0 KiB
Raw Permalink Blame History

SSO Portal

基于 Next.js 16 + Mantine 8 的 SSO Portal 登录服务,登录页复用 uirefbase 的 UI 风格。

📘 接入指南INTEGRATION_GUIDE.md —— 面向其他前端应用的通用接入文档OAuth2 授权码流程 / 环境变量 / 安全 / FAQ / 后端接口速查)。

快速开始

pnpm install
pnpm dev        # http://localhost:5501

环境变量

按环境拆分,已随仓库提交(参考 uirefbase 约定):.env.development / .env.staging / .env.production。 本地私有覆盖请写入 .env*.local(已被 .gitignore 忽略,不入库)。

变量 说明 示例
NEXT_PUBLIC_BASE_PATH 部署子路径,无则留空 ""
NEXT_PUBLIC_SHARED_API_PATH 后端 basis 服务地址(登录 / 验证码 / 租户列表都走这里) dev: http://172.16.115.31:6610/
prod: http://basis-app-svc:6610
SSO_TENANT SSO 接口的租户标识account / phone-smscode / access_token 共用) cowarobot

无密钥可安全入库。Next.js 会按 NODE_ENV 自动加载对应文件(next dev → developmentnext build/start → production

测试账号

账号 密码 姓名
admin 123456 管理员
user01 123456 测试用户
zhangsan 123456 张三

手机号登录:验证码由真实后端 /api/v1/basis/user/phone/code 发送,需使用后端真实账号对应的手机号(账号同理以真实后端数据为准)。

SSO 登录流程

1. 外部应用发起 SSO 请求

http://localhost:5501/login?app_id=your_app_id&app_url=http%3A%2F%2Flocalhost%3A3000%2Fcallback

2. 用户在此页面登录

3. 登录成功后自动跳转

http://localhost:3000/callback?sso_code=xxxxx

4. 外部应用用 code 换取 access_token

外部应用拿到 sso_code 后,由其服务端直接调真实后端换 tokensso-portal 不再提供 code 换信息接口):

curl -X POST http://172.16.115.31:6610/api/v1/basis/sso/access_token \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "6wds5qua3b76hu748zrjmall",
    "client_secret": "<服务端密钥>",
    "code": "your_sso_code",
    "grant_type": "authorization_code",
    "tenant": "cowarobot"
  }'

返回 access_token(及可选 refresh_token / user),外部应用据此建立会话。

直接访问

当前 sso-portal 为纯 SSO 透传模式:/login 必须带 app_id / app_url 参数,登录成功后回跳外部应用;不再支持无 SSO 参数的本地登录(缺参时后端登录接口会拒绝签发授权 code

API

接口 方法 说明
/api/login POST 账号 / 手机登录,透传后端 /sso/* 返回授权 code
/api/getVerifyCode POST 发送手机验证码(透传 /api/v1/basis/user/phone/code
/api/front/getAbbrList GET 租户简称列表
/api/mock/users GET 测试用户列表