主从域名网站单点登录配置流程详解,如何解决跨域SSO认证问题?

配置主从域名网站单点登录

基本概念与准备

主从域名(Primary Domain & Secondary Domain)是指同一应用下,主域名作为核心认证中心(如main.com),从域名(如sub.main.com)作为业务子域,单点登录(SSO)的核心目标是让用户只需一次登录,即可访问所有关联域名下的资源,提升用户体验与安全性。

主从域名网站单点登录配置流程详解,如何解决跨域SSO认证问题?

核心流程

用户访问从域名网站时,系统会重定向至主域名的SSO认证中心完成身份验证;认证成功后,认证中心返回授权令牌(如JWT),从域名通过该令牌验证用户身份,无需重复登录。

准备工作

  1. 环境准备
    • 主域名服务器(部署认证服务器,如Keycloak)、从域名服务器(部署业务网站,如Nginx+PHP/Node.js);
    • 数据库(MySQL/PostgreSQL,用于存储用户信息);
    • HTTPS证书(确保传输安全)。
  2. 域名解析
    • 主域名(如main.com)指向主服务器IP;
    • 从域名(如sub.main.com)指向从服务器IP。
  3. 基础配置
    • 安装Nginx(从域名反向代理)、Keycloak(主域名SSO服务器)、PHP(从域名后端);
    • 配置数据库连接(Keycloak与从域名后端均需访问数据库)。

主域名(认证中心)配置步骤

主域名作为SSO认证中心,需部署并配置认证服务器(以Keycloak为例),实现用户身份验证与令牌生成。

安装与初始化Keycloak

# 下载Keycloak
wget https://github.com/keycloak/keycloak/releases/download/21.1.3/keycloak-21.1.3.tar.gz
tar -xzf keycloak-21.1.3.tar.gz
cd keycloak-21.1.3
# 启动服务器
./bin/start-keycloak.sh

访问http://main.com:8080,进入初始化界面,设置管理员密码、数据库连接(默认使用H2内存数据库,需切换为MySQL/PostgreSQL)。

创建用户存储与用户组

  • 进入Keycloak管理界面,选择“Realm”(如main),点击“Users”→“Add User”,添加管理员用户(用于后续配置);
  • 在“Groups”中创建“admin”组(用于从域名用户)。

配置SSO客户端(从域名)

  • 在Keycloak中,选择“Clients”→“Create”;
    • 客户端IDsub-client(从域名SSO客户端标识);
    • 会话管理:选择“Remember me”(允许记住用户);
    • 授权协议:选择“OAuth 2.0”;
    • 授权码模式:启用(SSO常用模式);
    • 重定向URI:添加从域名的回调URL(如http://sub.main.com/callback);
    • 客户端密钥:生成并保存(后续从域名配置需使用)。

配置安全规则

  • 进入“Realm”→“Security”→“Authorization”,添加规则:
    {
      "rules": [
        {
          "type": "custom",
          "condition": {
            "function": "hasRole",
            "values": ["admin"]
          },
          "action": "permit"
        }
      ]
    }

    (仅允许“admin”组用户访问受保护资源)。

从域名(客户端)配置步骤

从域名作为业务应用,需集成Keycloak的OAuth2客户端,实现用户认证与令牌验证。

主从域名网站单点登录配置流程详解,如何解决跨域SSO认证问题?

Nginx反向代理配置

在从域名Nginx配置文件中添加SSL与反向代理:

server {
    listen 443 ssl http2;
    server_name sub.main.com;
    ssl_certificate /etc/ssl/certs/sub.crt;
    ssl_certificate_key /etc/ssl/private/sub.key;
    location / {
        proxy_pass http://localhost:3000; # 假设后端服务运行在3000端口
        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;
    }
    location /callback {
        proxy_pass http://main.com:8080/realms/main/protocol/openid-connect/token;
        proxy_set_header Host main.com;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

(需生成sub.main.com的SSL证书,并配置反向代理到后端服务)。

后端集成OAuth2客户端

以Node.js(Express)为例,配置OAuth2客户端:

const express = require('express');
const axios = require('axios');
const session = require('express-session');
const passport = require('passport');
const OAuth2Strategy = require('passport-oauth2').Strategy;
const app = express();
app.use(session({ secret: 'secret-key', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
// 配置Keycloak OAuth2策略
passport.use(new OAuth2Strategy({
    authorizationURL: 'http://main.com:8080/realms/main/protocol/openid-connect/auth',
    tokenURL: 'http://main.com:8080/realms/main/protocol/openid-connect/token',
    clientID: 'sub-client',
    clientSecret: 'your-client-secret',
    callbackURL: 'http://sub.main.com/callback'
}, async (accessToken, refreshToken, profile, done) => {
    // 获取用户信息并存储会话
    done(null, { id: profile.sub, username: profile.name });
}));
passport.serializeUser((user, done) => done(null, user));
passport.deserializeUser((user, done) => done(null, user));
// 登录页面
app.get('/', (req, res) => {
    res.send('<a href="/login">登录</a>');
});
// 登录回调
app.get('/login', passport.authenticate('oauth2'));
// 认证成功回调
app.get('/callback', passport.authenticate('oauth2', {
    successRedirect: '/',
    failureRedirect: '/login'
}));
// 受保护资源
app.get('/protected', (req, res) => {
    if (req.isAuthenticated()) {
        res.send(`欢迎, ${req.user.username}!`);
    } else {
        res.send('请先登录');
    }
});
app.listen(3000, () => console.log('Server running on port 3000'));

(需替换clientSecret为Keycloak中SSO客户端的密钥,并确保回调URL与Keycloak配置一致)。

令牌验证

在受保护资源(如/protected)中,通过req.user验证用户身份(已由passport完成令牌验证),无需额外调用Keycloak。

主从域名网站单点登录配置流程详解,如何解决跨域SSO认证问题?

关键技术点解析

SSO协议选择

  • OAuth2:适用于Web应用与API,支持授权码模式、隐式模式等,适合从域名与主域名的交互;
  • SAML:适用于企业内部系统,通过断言传递用户信息,需配置X.509证书;
  • OpenID Connect:OAuth2的扩展,增加用户信息端点(/userinfo),适合需要用户名/邮箱的场景。

安全性保障

  • HTTPS:所有通信必须通过HTTPS,防止令牌泄露;
  • CSRF保护:在回调URL中添加CSRF令牌(如state参数);
  • 令牌过期:设置短效令牌(如5-15分钟),避免长期滥用;
  • 密钥管理:定期更换Keycloak客户端密钥,防止密钥泄露。

验证与测试

  1. 访问从域名:打开http://sub.main.com,点击“登录”链接,应重定向至http://main.com:8080/realms/main/protocol/openid-connect/auth
  2. 登录验证:输入主域名用户名/密码(如admin),成功后返回http://sub.main.com/callback,显示登录成功;
  3. 受保护资源访问:访问http://sub.main.com/protected,应显示欢迎信息(如“欢迎, admin!”),未登录则提示“请先登录”。

常见问题与解答

Q1:配置后,从域名无法获取用户信息怎么办?

解答

  • 检查回调URL是否与Keycloak配置一致(如http://sub.main.com/callback);
  • 确认Keycloak客户端密钥是否正确(需与从域名后端配置匹配);
  • 检查Nginx反向代理是否将回调请求正确转发至Keycloak(需配置proxy_pass指向main.com:8080);
  • 验证Keycloak中“从域名”客户端的“重定向URI”是否包含http://sub.main.com/callback

Q2:如何确保SSO的安全性?

解答

  • 强制HTTPS:所有域名(主域名、从域名)均需配置SSL证书,避免明文传输;
  • 令牌签名:Keycloak使用RSA/ECDSA密钥对签名令牌,从域名需验证签名(如通过req.usersub字段);
  • CSRF防护:在回调URL中添加state参数(如http://main.com:8080/...?state=abc),并在从域名中验证state参数是否匹配;
  • 定期更新密钥:Keycloak客户端密钥每3-6个月更换一次,避免长期使用导致安全风险。

通过以上步骤,可实现主从域名间的单点登录,提升用户体验与系统安全性。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/208887.html

(0)
上一篇2026年1月3日 19:40
下一篇 2026年1月3日 19:45

相关推荐

  • 家用智能监控机器人,如何成为家庭安全守护神?

    随着科技的不断发展,家用智能监控机器人逐渐走进了千家万户,这种家庭智能监控机器人不仅能够提供安全保障,还能为家庭生活带来诸多便利,本文将详细介绍家用智能监控机器人的功能、选购技巧以及使用方法,家用智能监控机器人的功能实时监控家用智能监控机器人可以通过高清摄像头实现家庭环境的实时监控,让用户随时随地了解家中情况……

    2025年11月7日
    0370
  • 计算机名和域名究竟有何不同?它们在网络中分别扮演什么角色?

    在数字化浪潮席卷全球的今天,我们每天都在与网络打交道,无论是浏览网页、收发邮件还是访问公司内网的共享文件,在这个过程中,两个看似相似却截然不同的概念时常出现:计算机名和域名,虽然它们都扮演着“地址”或“名字”的角色,但其作用范围、工作机制和应用场景有着本质的区别,理解这两者的差异,不仅是网络知识的基础,更是解决……

    2025年10月28日
    0330
  • 如何正确配置远程Linux服务器时间设置?遇到问题怎么办?

    配置远程Linux服务器时间设置在Linux系统中,正确的时间设置对于系统的正常运行至关重要,对于远程Linux服务器,由于地理位置和时区差异,正确配置时间尤为重要,本文将详细介绍如何配置远程Linux服务器的系统时间,时间同步方法使用NTP(Network Time Protocol)同步时间NTP是一种用于……

    2025年12月22日
    0240
    • 服务器间歇性无响应是什么原因?如何排查解决?

      根源分析、排查逻辑与解决方案服务器间歇性无响应是IT运维中常见的复杂问题,指服务器在特定场景下(如高并发时段、特定操作触发时)出现短暂无响应、延迟或服务中断,而非持续性的宕机,这类问题对业务连续性、用户体验和系统稳定性构成直接威胁,需结合多维度因素深入排查与解决,常见原因分析:从硬件到软件的多维溯源服务器间歇性……

      2026年1月10日
      020
  • 配置共享服务器遇到问题?新手入门的步骤与技巧详解

    共享服务器配置全流程指南共享服务器作为企业或组织内部资源集中管理的核心设施,通过统一部署存储、计算等资源,实现了多用户环境下的高效资源分配与数据共享,其核心价值在于提升资源利用率、简化数据管理流程、保障数据安全与访问控制,是现代信息化建设中不可或缺的一环,配置共享服务器需遵循标准化流程,确保环境稳定、功能完善且……

    2026年1月3日
    01100

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注