README.md
Rama main · réplica de lectura del repositorio original.
# 单点登录服务
一个简单、轻量支持自托管的单点登录服务,用于简化登录认证操作,支持 OTP 方式登录,同时可以作为 `Traefik Forward Auth` 后端使用。[变更日志](./CHANGELOG-zh.md)
For English users: [ENGLISH VERSION](./README-en.md).
## 程序截图
作为一个简单的轻量级程序,它只有四个图形界面:登录、OTP登录、OTP绑定、帐户页面。

## Docker
你可以尝试使用 Docker 在几秒钟内运行一个属于你的私有服务:
```bash
docker run -d --name=sso-server \
-e CLIENT_NAME="YOUR OWN SSO SERVER" \
-e CLIENT_ID="YOUR_OAUTH_CLIENT_ID" \
-e CLIENT_SECRET="YOUR_OAUTH_CLIENT_SECRET" \
-e USER_PASS="password" \
-p 3000:80 soulteary/sso-server:1.1.5
```
服务启动之后,使用浏览器访问 `http://localhost:3000/login`,将可以看到登录界面。
默认的账号密码是 `username`(不带引号)和 `password`(密码由用户通过 `USER_PASS` 变量设置,示例中的密码是这个)。
注意:服务使用的 `username` 和 `user_email` 字段内容,默认将根据“授权许可文件”进行初始化。你可以阅读下文中“配置文件”以及参考示例文件,来了解如何使用授权文件。你可以通过自助生成授权文件来定义你的`用户名`和`邮箱地址`,[点击此处在线生成](https://readers-lic-gift.suyang.wiki/)。
## API 及路由
作为用户,我们只需要了解两个路由即可:
- Router
- 登录页面: `/login`
- 登出登录: `/logout`
除此之外,还有两个不太重要的路由,它们是:
- Router
- 用于容器健康检查使用: `/health`
- 用户账号信息展示: `/account`
程序当前支持五种常用的 API:
- API
1. 当前账号登出: `/logout`
2. OAuth Token: `/oauth/token`
3. OAuth 用户信息: `/api/userinfo`,
4. OAuth 客户端信息: `/api/clientinfo`,
5. Traefik Forward Auth: `/api/traefik-auth-user`
6. Outline 用户信息: `/api/outline/oidc`
一般情况下,你不需要知道如何使用它们,你只需要知道如何将它们填入需要使用认证的程序配置里就行了,像是这样:
```ini
tokenURL = 'http://host-name-or-ip/oauth/token'
authorizationURL = 'http://host-name-or-ip/dialog/authorize'
profileUrl = 'http://host-name-or-ip/api/userinfo'
```
## 程序指纹
为了保证程序的安全,程序启动时,会输出一个唯一的校验值。
**如果数值与下表不符,请不要继续运行程序。**
- 版本: **soulteary/sso-server:1.1.6**
- 指纹: `060d0706d05dabd66bbc94b858b481763c310cfb3702ffce0a87c3f857b26327`
- 镜像: `dbf19912a279dd02c2c18a152ce5b61bd088845f194f693baa924a10eddb96e6`
查看所有[历史版本](./CHECKSUM.md)的指纹。
## 当前支持登录模式
- OAuth2
- OTP
- (计划中) L2TP
## 资源使用
- CPU 使用率: <1%
- MEM 使用率: ~15MiB
## 配置文件 (`.env` 及环境变量)
为了保证程序能够正确运行,我们需要定义一些变量,其中大部分配置都是可选的。(可以忽略)
| 环境变化 | 是否可选 | 示例 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| **USER_PASS** | 否 | `YOUR_PASS_WORD` | `password` | 设置属于你的账号密码。 |
| **CLIENT_ID** | 否 | `YOUR_CLIENT_ID` | `SjVN7VhgOsku` | OAuth2 认证需要使用的 Client ID |
| **CLIENT_SECRET** | 否 | `YOUR_CLIENT_SECRET` | `t3Qt89nv9u5O` | OAuth2 认证需要使用的 Client Secret |
| CLIENT_ISTRUSTED | 是 | `true` | `false` | 如果设置为 True,则需要授权的程序无需用户明确授权确认即可使用用户信息 |
| CLIENT_NAME | 是 | `My CLIENT NAME` | `GENERAL SSO SERVER` | 仅用于页面或命令行信息显示。如果未设置,将尝试使用 `SERVER_NAME` 变量进行替代。 |
| SERVER_NAME | 是 | `My SSO Server` | `SSO Server` | 仅用于OTP工具、Web 页面或命令行信息显示 |
| PORT | 是 | `8080` | `80` | docker中的程序监听端口 |
| OTP_OPTION | Yes | `KEY:MIZUSR2ZJZTWUSDY;PERIOD:30` | 空 | 用户指定的OTP参数,第一次绑定后,可以在用户页面获得 |
| SESSION_SECRET | 是 | `iWoupoFYZ9Ud` | `RANDOM STRING()` | 仅用于页面或命令行信息显示 |
| SERVER_DOMAIN | 是 | `sso.example.com` | 空 | 仅在 Traefik docker-compose.yml 文件中需要 |
| LICENSE | 是 | `...(huge text)` | `PRESET_LICENSE_TEXT` | 用户许可协议的内容,和 `LICENSE_FILE` 二选一使用 |
| LICENSE_FILE | 是 | `/app/my.lic` | 空 | 用户许可协议文件的文件路径,和 `LICENSE` 二选一使用 |
### 针对不同应用进行授权区分
如果你需要针对不同的应用设置不同的授权参数,则可以使用 `CLIENT_*` 系列参数。
| 环境变化 | 是否可选 | 示例 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| CLIENT_1_ID | 否 | `YOUR_CLIENT_ID` | `SjVN7VhgOsku` | 作用和 `CLIENT_ID` 一致,为某个应用或者某类应用单独指定 |
| CLIENT_1_SECRET | 否 | `YOUR_CLIENT_SECRET` | `t3Qt89nv9u5O` | 作用和 `CLIENT_SECRET` 一致,为某个应用或者某类应用单独指定 |
| CLIENT_1_ISTRUSTED | 是 | `true` | `false` | 作用和 `CLIENT_ISTRUSTED` 一致,为某个应用或者某类应用单独指定 |
| CLIENT_1_NAME | 是 | `My CLIENT NAME` | `GENERAL SSO SERVER` | 作用和 `CLIENT_NAME` 一致,为某个应用或者某类应用单独指定 |
目前程序支持 1 ~ 5,所以我们可以定义五个不同的应用,应该足够一般场景使用。
## 示例
可以在[此处](./example)查看更多 docker 示例。
默认账号:
- 用户名: `username`
- 密码: `password`
为了进一步提高程序的安全性,默认服务重启时需要重新扫码设置账户的 OTP 验证。这个默认行为允许通设置固定的 `OTP_OPTION` 进行变更。
## 可选项:出站网络限制
本项目不需要使用外网服务。如果你担心这个程序,可以参考下面的方法来限制容器中的程序访问外网数据,从根本上解决你的顾虑,:D
https://github.com/francoisruty/fruty_docker-outbound-restriction