配置主从域名网站单点登录
基本概念与准备
主从域名(Primary Domain & Secondary Domain)是指同一应用下,主域名作为核心认证中心(如),从域名(如
sub.main.com
)作为业务子域,单点登录(SSO)的核心目标是让用户只需一次登录,即可访问所有关联域名下的资源,提升用户体验与安全性。
核心流程
用户访问从域名网站时,系统会重定向至主域名的SSO认证中心完成身份验证;认证成功后,认证中心返回授权令牌(如JWT),从域名通过该令牌验证用户身份,无需重复登录。
准备工作
主域名(认证中心)配置步骤
主域名作为SSO认证中心,需部署并配置认证服务器(以Keycloak为例),实现用户身份验证与令牌生成。
安装与初始化Keycloak
# 下载Keycloakwget-xzf keycloak-21.1.3.tar.gzcd keycloak-21.1.3# 启动服务器./bin/start-keycloak.sh
访问
,进入初始化界面,设置管理员密码、数据库连接(默认使用H2内存数据库,需切换为MySQL/PostgreSQL)。
创建用户存储与用户组
配置SSO客户端(从域名)
配置安全规则
从域名(客户端)配置步骤
从域名作为业务应用,需集成Keycloak的Oauth2客户端,实现用户认证与令牌验证。
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# 假设后端服务运行在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_passHost 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('登录');});// 登录回调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
)中,通过验证用户身份(已由passport完成令牌验证),无需额外调用Keycloak。
关键技术点解析
SSO协议选择
安全性保障
验证与测试
常见问题与解答
Q1:配置后,从域名无法获取用户信息怎么办?
解答 :
Q2:如何确保SSO的安全性?
解答 :
通过以上步骤,可实现主从域名间的单点登录,提升用户体验与系统安全性。
为什么QQ安装后,不能运行,提示说,无法完成验证,可能是QQ的文件已损坏,您需要重新安装QQ。可我已经安装很多次了
我也试过这种情况,你一定是在官网下载到硬盘后安装的,那个好像有问题,后来我选择“在线安装”就可以了
本田i-VTEC发动机用什么机油好呢?
挂住中!现在用5W-30水蓝,下周期准备上水灰
QQ无法完成验证,可能文件损坏
首先不是电脑问题 主要是腾讯的问题,现在反应这问题的人有很多(我修电脑的)














发表评论