单点登录 SSO 系统搭建教程

单点登录(Single Sign-On,SSO)允许用户只需登录一次,就可以访问所有关联的应用系统。对于在搬瓦工 VPS 上运行多个 Web 应用的用户来说,SSO 可以大幅提升管理效率和用户体验。本文将使用 Keycloak 搭建企业级的 SSO 认证中心。Keycloak 是 Red Hat 维护的开源身份和访问管理解决方案,支持 OpenID Connect、OAuth2 和 SAML 协议。

一、系统要求

  • 内存:至少 2GB,推荐 4GB。
  • Docker:推荐 Docker Compose 部署。
  • 数据库:PostgreSQL(推荐)或 MySQL。

二、Docker 部署 Keycloak

mkdir -p /opt/keycloak && cd /opt/keycloak

创建 docker-compose.yml

version: '3.8'

services:
  keycloak:
    image: quay.io/keycloak/keycloak:24.0
    restart: always
    ports:
      - "8180:8080"
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://db:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: keycloak_password
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: 你的管理员密码
      KC_HOSTNAME: sso.example.com
      KC_PROXY_HEADERS: xforwarded
      KC_HTTP_ENABLED: "true"
    command: start
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    restart: always
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: keycloak_password
    volumes:
      - keycloak_db:/var/lib/postgresql/data

volumes:
  keycloak_db:
docker compose up -d

三、Nginx 反向代理

server {
    listen 80;
    listen 443 ssl http2;
    server_name sso.example.com;

    ssl_certificate /etc/letsencrypt/live/sso.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sso.example.com/privkey.pem;

    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    location / {
        proxy_pass http://127.0.0.1:8180;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
    }
}
nginx -t && systemctl reload nginx

四、配置 Realm 和客户端

访问 https://sso.example.com,使用管理员账号登录。

4.1 创建 Realm

Realm 是 Keycloak 的核心概念,代表一个独立的认证域。建议为你的应用创建专门的 Realm(不使用默认的 master Realm):

  • 在左上角下拉菜单中点击"Create Realm"。
  • 填写 Realm 名称(如 "myapps")。
  • 启用并保存。

4.2 创建客户端

为每个需要接入 SSO 的应用创建客户端:

  • 进入"Clients > Create Client"。
  • Client ID 填写应用标识(如 "webapp")。
  • Client Protocol 选择 "openid-connect"。
  • 设置 Valid Redirect URIs 为应用的回调地址。
  • 根据应用类型选择 Access Type(confidential 适合服务端应用)。

4.3 创建用户

在"Users"中创建用户账号,设置密码和角色。也可以配置外部身份提供商(如 Google、GitHub)实现社交登录。

五、应用集成

5.1 Node.js 应用集成

npm install openid-client
const { Issuer } = require('openid-client');

async function setupOIDC() {
  const issuer = await Issuer.discover('https://sso.example.com/realms/myapps');
  const client = new issuer.Client({
    client_id: 'webapp',
    client_secret: '你的客户端密钥',
    redirect_uris: ['https://app.example.com/callback'],
    response_types: ['code'],
  });

  // 生成授权 URL
  const authUrl = client.authorizationUrl({
    scope: 'openid email profile',
  });

  // 处理回调
  async function handleCallback(req) {
    const params = client.callbackParams(req);
    const tokenSet = await client.callback(
      'https://app.example.com/callback',
      params
    );
    const userinfo = await client.userinfo(tokenSet.access_token);
    return userinfo;
  }
}

5.2 Nginx 身份验证代理

使用 oauth2-proxy 为不支持 OIDC 的应用添加 SSO 保护:

docker run -d \
  --name oauth2-proxy \
  -p 4180:4180 \
  quay.io/oauth2-proxy/oauth2-proxy:latest \
  --provider=keycloak-oidc \
  --client-id=webapp \
  --client-secret=你的密钥 \
  --oidc-issuer-url=https://sso.example.com/realms/myapps \
  --redirect-url=https://app.example.com/oauth2/callback \
  --email-domain=* \
  --cookie-secret=随机32字节Base64密钥 \
  --upstream=http://127.0.0.1:8080

六、多因素认证(MFA)

在 Keycloak 管理面板中启用多因素认证:

  • 进入"Authentication > Required Actions"。
  • 启用"Configure OTP"并设为默认必须。
  • 用户下次登录时会被要求配置 TOTP(如 Google Authenticator)。

七、数据备份

# 备份 PostgreSQL 数据
docker compose exec db pg_dump -U keycloak keycloak > /root/backups/keycloak_$(date +%Y%m%d).sql

# 导出 Realm 配置
docker compose exec keycloak /opt/keycloak/bin/kc.sh export --dir /tmp/export --realm myapps
docker cp keycloak-keycloak-1:/tmp/export /root/backups/keycloak_realm_$(date +%Y%m%d)

总结

Keycloak 是功能最全面的开源 SSO 解决方案,支持 OIDC、OAuth2、SAML 等多种协议,内置用户管理、多因素认证、社交登录等企业级功能。在搬瓦工 VPS 上通过 Docker 部署方便快捷,建议使用 2GB 以上内存的方案。如果你只需要简单的 OAuth2 功能,可以参考更轻量的 Ory Hydra 方案

选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 进入官网购买。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。