# 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/`
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` 后,由其**服务端**直接调真实后端换 token(sso-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 | 测试用户列表 |