1. OAuth2授权码模式全链路交互详解
在分布式系统架构中,如何安全地实现跨系统资源访问是一个关键问题。OAuth2授权码模式(Authorization Code Flow)作为最安全的OAuth2流程,被广泛应用于企业级SSO(单点登录)和API资源访问控制场景。本文将深入剖析从SSO登录到跨系统资源访问的完整交互链路。
1.1 核心角色与场景
让我们从一个典型场景开始:用户Zhangsan想要在"系统B"里查看他在"系统A"的订单,但他还没有登录任何系统。这个场景涉及四个核心角色:
- User(用户):Zhangsan,最终的操作主体
- Client(系统B):需要访问资源的客户端系统
- Resource Server(系统A):存储和管理目标资源的服务器
- Authorization Server(AS):负责身份认证和授权的中心服务
这种架构的核心价值在于实现了"最小权限原则"——系统B不应该拥有系统A所有接口和数据的权限,而应该按需获取特定范围的访问权限。
1.2 全链路交互流程概述
完整的OAuth2授权码模式交互可以分为六个关键阶段:
- SSO登录与授权意愿确认:用户在授权中心完成认证并同意系统B访问系统A的特定资源
- 授权码兑换访问令牌:系统B用授权码向AS换取访问令牌
- 本地会话建立:系统B同步用户身份并建立自己的会话体系
- 跨系统资源访问:系统B代理用户向系统A请求数据
- 令牌内省验证:系统A向AS验证令牌有效性
- SSO验证(系统C静默登录):利用已有SSO会话实现无缝登录其他系统
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 身份证明:SSO登录与授权意愿
2.1 发起授权请求
当未登录用户访问系统B时,前端会执行以下操作:
- 检查浏览器localStorage,确认无有效用户凭证
- 展示SSO登录链接,用户点击后重定向至AS前端页面(SSO.vue)
- URL中包含关键OAuth2参数:
http复制
https://as.com/authorize? client_id=systemB& resource_id=systemA& scope=user.read+order.read& response_type=code& redirect_uri=https://systemB.com/callback& state=random123
这些参数明确表达了系统B的意图:以用户名义访问系统A的user.read和order.read权限。
2.2 SSO静默检测
AS前端(SSO.vue)加载时触发授权检查:
- 向AS后端发送
GET /authorize请求,透传所有参数 - AS后端执行两层校验:
- 合法性校验:确认client_id有效且有权访问目标resource_id
- 身份校验:因无有效AccessToken,返回401 Unauthorized
- 前端捕获401后,导航至统一登录页面
安全提示:state参数用于防止CSRF攻击,应由系统B后端生成并验证
2.3 授权中心登录
用户在登录页面提交凭证后:
- 前端发送
POST /login请求到AS后端 - AS验证凭证有效性,建立SSO全局会话
- 颁发SSO会话凭证
AccessToken1(注意:这是AS自身的会话
