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

84 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SSO Portal
基于 Next.js 16 + Mantine 8 的 SSO Portal 登录服务,登录页复用 uirefbase 的 UI 风格。
> 📘 **接入指南**[INTEGRATION_GUIDE.md](./INTEGRATION_GUIDE.md) —— 面向其他前端应用的通用接入文档OAuth2 授权码流程 / 环境变量 / 安全 / FAQ / 后端接口速查)。
## 快速开始
```bash
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/`<br>prod: `http://basis-app-svc:6610` |
| `SSO_TENANT` | SSO 接口的租户标识account / phone-smscode / access_token 共用) | `cowarobot` |
> 无密钥可安全入库。Next.js 会按 `NODE_ENV` 自动加载对应文件(`next dev` → development`next 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 换信息接口):
```bash
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 | 测试用户列表 |