SSO 方案

news/2025/12/7 17:04:01/文章来源:https://www.cnblogs.com/zxlh1529/p/19166926

为多个域/子域、Web 与移动端,提供安全、可扩展、对外可接入的单点登录服务(SSO)。采用 OAuth2 Authorization Code + PKCEOpenID Connect (OIDC) 标准,现在简单介绍一下:


核心概念

  • IdP(Identity Provider):集中认证服务,负责用户认证、会话管理、签发 Token。
  • Client(Relying Party, RP):各子系统/应用(如 main.example.com, learn.example.com),通过 OAuth2 与 IdP 交互。
  • Authorization Code Flow (with PKCE):安全的授权码流程,适用于单页面应用与原生应用。
  • ID Token / Access Token / Refresh Token:ID Token(用户信息,JWT)、Access Token(授权 API)、Refresh Token(续期)。

高级流程(浏览器用户)

  1. 用户访问 main.example.com,未登录,点击登录。
  2. main.example.com 重定向到 IdP 授权端点:
GET https://auth.example.com/authorize?client_id=web-client&response_type=code&scope=openid profile email&redirect_uri=https://main.example.com/auth/callback&state=xyz&code_challenge=abc&code_challenge_method=S256
  1. IdP 完成身份验证(用户名/密码、第二因素等),在 IdP 建立会话(IdP 在其域下设置 HttpOnly, Secure 的会话 Cookie,例如 AUTH_SESSION)。

  2. IdP 重定向回 redirect_uri,附带 codestate

  3. main.example.com 后端使用 code(和 PKCE verifier)向 IdP 的 /token 端点交换 access_tokenid_tokenrefresh_token。此请求为后端到 IdP 的机密请求(client_secret 或 mTLS)。

  4. IdP 返回 tokens。后端:

    • 可将 refresh_token 写入HttpOnly,Secure,SameSite=None 的 Cookie(域为 IdP 或 client 依据架构)。
    • Access Token 可放在后端 session 中或短期保存在 HttpOnly cookie。ID Token 用于获取用户信息。
  5. main.example.com 创建自己的登录态(session / 本域 Cookie),用户在 learn.example.com 访问时依然保持已登录。


为什么 IdP 的会话能实现 SSO?

因为 IdP 在其域(如 auth.example.com)下为用户建立了“认证会话(AUTH_SESSION)”。当用户在另一个客户端(例如 learn.example.com)需要登录时,客户端会重定向到 IdP 的 /authorize:IdP 检测到已有 AUTH_SESSION,直接跳过凭证输入,完成授权并返回 code,从而实现无感单点登录。


关键端点

  • GET /authorize — 请求授权(浏览器重定向)
  • POST /token — 用授权码换取 token(后端到 IdP)
  • GET /userinfo — 使用 Access Token 获取用户信息
  • POST /revoke — 撤销 token(登出与安全处置)
  • GET /.well-known/openid-configuration — OIDC 元数据

登出(Single Logout)

  • 前端触发:客户端调用 IdP 的 end_session 端点并传入 id_token_hintpost_logout_redirect_uri,IdP 清理自身会话 cookie 并可回调各客户端(后端或前端)以通知登出。
  • Back-Channel Logout:IdP 对各已注册的客户端发起服务端回调以通知登出。

注意:真正的全局登出在分布式系统中是有挑战的,建议结合短 token、revocation 与回调机制。


  • IdP 会话 Cookie(AUTH_SESSION)Domain=auth.example.comDomain=.example.com(取决部署),必须 HttpOnly; Secure; SameSite=None
  • Refresh Token:放在 HttpOnly, Secure Cookie(如果是 Web 后端交换)或仅存在 IdP(对 SPA,放在 Authorization Code + PKCE 后端托管)。
  • Access Token:短期,尽量放在内存或后端,不直接写入可被 JS 访问的地方。
  • 客户端登录态:客户端可选择使用自有 session(server-side session 或 signed cookie),并通过后端与 IdP 交互刷新/验证。

简要示例(Node.js)

1. 客户端重定向到 IdP /authorize

// 前端触发,后端生成 state & code_challenge
res.redirect(`https://auth.example.com/authorize?client_id=${CLIENT_ID}&response_type=code&redirect_uri=${REDIRECT_URI}&scope=openid%20profile&state=${state}&code_challenge=${challenge}&code_challenge_method=S256`);

2. IdP /token(简化示例)

app.post('/token', (req, res) => {const { code, code_verifier, redirect_uri, client_id } = req.body;// 验证 code、pkce;颁发 access_token, id_token, refresh_tokenres.json({ access_token, id_token, refresh_token, token_type: 'Bearer', expires_in: 3600 });
});

3. 客户端使用 Refresh Token(后端安全存储)

// 后端通过存储的 refresh_token 与 IdP 交换新 access_token
const r = await fetch('https://auth.example.com/token', {method: 'POST',body: new URLSearchParams({ grant_type: 'refresh_token', refresh_token }),headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});

安全推荐(实践要点)

  • 优先使用 Authorization Code + PKCE(SPA/Native)。
  • 所有 Token 端点仅通过 HTTPS 访问
  • Refresh Token 使用 HttpOnly Cookie 或后端安全存储
  • 严格实现 CSRF 防护(state 参数)与重放保护(nonce)
  • Token 限制作用域与最短有效期,并使用撤销(revocation)机制。
  • 监控与异常检测(可疑登录、IP 变化、频繁刷新等)。

架构示意(ASCII)

User Browser│├─(1) /login --> Redirect to IdP /authorize│
IdP (auth.example.com)├─(2) Authenticate -> Set AUTH_SESSION cookie on IdP domain└─(3) Redirect back with code│
Client (main.example.com)├─(4) Server POST /token (code + verifier) -> receive tokens└─(5) Create client session (cookie) for appLater: another client (learn.example.com) redirects to IdP /authorize -> IdP sees AUTH_SESSION, issues code -> silent SSO

何时使用?

  • 需要对外开放登录(第三方应用、合作伙伴)。
  • 跨多个主域、移动端、微服务环境。
  • 需要遵循安全合规、审计、可扩展的身份管理方案。

So:标准化 SSO(OAuth2/OIDC)是面向长期、跨平台、跨组织场景的推荐方案。对于仅限同一主域内部子域的快速场景,集中 Session 模型是比较轻量且实用的选择,或者看之前文章介绍的类 SSO 哦~。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球AI一周动态(12月1日-7日):巨头战略博弈升级,技术爆发催生新生态

🔥 一、国家级战略:AI军备竞赛进入深水区 1. 中国五部门联合发布AI+医疗新政五部门联合发布《关于促进和规范"人工智能+医疗卫生"应用发展的实施意见》,提出两阶段目标,到2027年建立卫生健康行业高质量…

英语四级翻译

翻译必考点一节课搞定四六级翻译必考点_哔哩哔哩_bilibili 之一:one of 1.找主干 2.添加定语 3.检查主谓一致、时态、单复数、a/an 《水浒传》(Water Margin)是中国文学四大经典小说之一 Water Margin is one of th…

散修带你入门鸿蒙应用开发基础:启程篇(下) - 鸿蒙

鸿蒙应用开发基础:启程篇(下) 【课程目标】熟悉DevEco Studio界面布局与常用功能 掌握工程目录精简配置(忽略自动生成冗余文件) 了解工具内置汉化、代码提示等辅助功能 学会创建、管理ArkTS页面文件与组件【本节重…

多方案统一认证体系对比

在多系统、多子域、跨平台应用中,认证与登录状态同步是核心问题。不同架构阶段可采用不同方案,从传统 Session 模型到标准化 OAuth2 / OIDC SSO。域下的登录态共享可以看看之前文章提到了域登录态分享类 SSO。 现在简…

centos更新阿里源并同步更新系统时间

下面是如何替换为阿里源的步骤: 1. 备份原有的仓库配置文件 首先,建议备份原有的仓库配置文件,以防万一需要恢复。 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2. 下载阿…

齐次与非齐次的区别

啊丢,线性代数学了这么久,突然想到齐次和非齐次是啥区别。 齐次方程组的右边等于0,因此每个方程中的单项式可以看作次数相等,就叫齐次。 非齐次方程组右边不等于0,因此每个方程中有1次项也有0次项,次数不相等,就…

centos7 无法上网怎么办?

查看本机的IP 方法一:ifconfig查找 en0,inet 后面就是本机的IP方法二: 系统设置 -> WIFI -> 详细信息,弹出的页面也有IP地址信息parallels desktop的网络配置:centos虚拟机 -> 配置 -> 硬件 -> 网…

实用指南:[Linux命令分享]日志查看 — — less

实用指南:[Linux命令分享]日志查看 — — lesspre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

论文分享 |Spark-TTS:用解耦语音令牌实现高效可控的语音合成 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

昆明黄金推荐排行

昆明黄金推荐排行引言在昆明这个繁华的城市,黄金市场琳琅满目,消费者在选择黄金时往往会感到困惑。本文将为您提供一份昆明黄金推荐排行,帮助您在众多品牌中找到适合自己的黄金产品。一、品牌实力昆明廖金匠昆明廖金…

NOIP2025反思--杨芮溪

NOIP2025反思--杨芮溪NOIP2025反思

2025深圳/惠州组装线供应商TOP5评测!装配线/生产线/老化线/输送线等五大主流厂家推荐,技术创新+行业经验权威榜单发布,赋能工业自动化升级

随着制造业智能化转型加速,组装线、装配线及生产线设备作为工业生产的核心基础设施,其技术先进性与适配性直接影响企业生产效率与产品质量。本榜单基于技术实力、行业覆盖、服务能力三大维度,结合国内制造业协会数据…

一个很好的观察案例:成功究竟是因为我们比较牛,还是仅仅因为运气

雪球上一个热帖,喜提人生第一个100万作者在藏格上挣到100万,志得意满,分享喜悦。下面都是炫富大会,低于100w的都不好开口。我买过藏格,不过卖飞了,所以看到这个帖子难免心痛。。。不过除了商业互吹,还有个争论很…

AD24中快速添加网络标签的方法

AD24中快速添加网络标签的方法今天在画tc264的核心板,该芯片为144pin封装的芯片,需要引出的芯片引脚偏多,通过结合excel和ad自带的智能粘贴实现对网络标签的快速添加tc264核心板如上,接下来是步骤 (一)直接新建一个exc…

终极揭秘:8大免费AI论文神器,一键极速生成,毕业/期刊/职称论文全覆盖!

毕业论文是校园生活的难题,不少同学为此苦恼。不过,随着AI技术发展,有了更高效的写作伙伴。本文揭秘8大免费AI论文神器,包括鲲鹏智写、SciSpace等,覆盖毕业、期刊、职称论文。如鲲鹏智写能30分钟生成5万字初稿,支…

GitHub更新:垃圾账户通知现可准确隐藏,清理近600万条记录

GitHub改进了通知处理机制,当用户或仓库被标记为垃圾信息源时,其触发的所有通知(包括历史提及)将被可靠隐藏,不再计入未读计数。此次更新清理了约600万条相关通知,使通知体验更清晰、可操作。垃圾账户触发的通知…

MATLAB基于CNN的图像超分辨率重建实现

一、系统概述 本系统在MATLAB平台上实现了基于CNN的图像超分辨率重建,支持SRCNN、EDSR、RCAN等主流模型架构,包含数据预处理、模型训练、性能评估全流程。系统采用Deep Learning Toolbox构建网络,支持GPU加速训练,…

英语_阅读_School activities

选词/句填空 School is more than a place to learn; it is also an opportunity to make friends and explore new activities. As the school year progresses, there are many ways to 66 the activities offered b…

使用spaCy与spacy-llm构建知识图谱实战

本文详细介绍了如何利用spaCy库的预训练模型进行实体识别,并整合spacy-llm调用大语言模型进行关系抽取,从而从非结构化文本中自动构建结构化的知识图谱。文章包含具体的配置、代码示例和构建自定义任务的方案。概述 …

软件质量保障的未来:基于 LLM 多智能体的白盒化演进

软件质量保障的未来:基于 LLM 多智能体的白盒化演进冬令时北京时间夜晚 11:00 点,美股开盘已经半个小时,你整备搂着媳妇刷刷手机结束这充实的一天,但是手机通知中心疯狂的消息推送划破寂静。你盯着屏幕上毫不留情的…