资源 · 43
OAuth 和 OpenID Connect:验证端到端集成
分别测试登录、委托和数据权限,然后测试重定向、令牌、会话和撤销。
已更新 · 3 min
本指南有助于实现的目标
- 将身份与授权分离。
- 拒绝意外重定向和令牌。
- 像测试成功一样仔细地测试拒绝操作。
- 验证用户离开或发生事件后访问权限的移除。
快速检查
- 预期使用哪个提供商和颁发者?
- 重定向 URI 是否已准确注册?
- ID 令牌是否被错误地用作访问令牌?
- 每个资源是否都检查所有权?
- 哪些访问权限在撤销后仍然有效?
分步指南
- 1
绘制已部署的流程图。
识别公共或机密客户端、浏览器、授权服务器、API 和 OIDC 提供商。 记录代码和令牌的传输路径、存储者以及授予的角色。 销售流程图并不代表实际部署。
交付内容:流程、信任边界和组件所有者。
- 2
检查登录事务。
使用适用于客户端的 PKCE 代码流。 检查 S256、事务绑定、已注册重定向和防止伪造请求的保护。 测试意外 URI、错误的验证器、重放代码和意外颁发者。 RFC 9700 根据客户端类型区分需求和建议。
交付内容:允许和拒绝的测试结果。
- 3
验证正确的令牌。
API 根据格式和提供商规则验证其访问令牌:签名或自省、颁发者、受众、过期时间和权限。 OIDC 客户端单独验证身份令牌。 有效的签名并不能证明该令牌属于此 API。
交付内容:验证合约、受众和过期时间测试。
- 4
检查业务权限
测试由其他帐户拥有的对象、较低角色、私有字段和管理操作。 范围或已验证的网关不能替代对请求资源的服务器端检查。 使用已授权的测试帐户和数据。
交付成果:角色、对象、操作和预期拒绝矩阵。
- 5
演练过期和撤销机制
分离本地会话、提供商会话、访问令牌和刷新令牌。 测试离场、设备丢失、角色变更、签名密钥轮换和提供商中断等情况。 记录剩余访问时间,而不是假设注销会立即撤销所有权限。
交付成果:访问权限移除时间表和例外情况。
- 6
在不泄露密钥的情况下进行观察
记录事务引用、验证决策、错误类别和配置版本。 排除代码、令牌和密钥。 准备诊断、集成关闭和回滚到已验证的配置;在提供商更改后重放测试。
交付成果:操作规程和回归测试。
虚构示例
示例情境
示例场景:两个客户端使用同一个身份提供商。 第一个客户端使用的令牌被提交给第二个客户端的 API。
决策及预期证据
API 拒绝了错误的受众,记录了无令牌跟踪,并且没有返回任何数据。 此拒绝操作成为回归测试。
区分机制
| 机制 | 目的 | 验证或限制 |
|---|---|---|
| OAuth 2.0 | 委托资源访问 | 服务器端对象权限 |
| OpenID Connect | 通过已验证的 ID 令牌建立身份 | 颁发者、受众和交易验证 |
| 应用程序会话 | 维护应用程序登录 | 过期、失效和会话保护 |
管理指标
| 指标 | 衡量内容 | 首要行动 |
|---|---|---|
| 更正拒绝 | 实际阻止禁止的情况 | 修复所有意外接受 |
| 撤销延迟 | 相关访问权限消失的时间 | 分别检查会话和令牌 |
| 验证失败 | 按原因和版本拒绝 | 将攻击与配置错误区分开来 |
常见错误
- 混淆身份验证和授权
- 检查签名后接受任何受众
- 注册广泛的重定向 URI
- 日志记录 便于调试的令牌
常见问题解答
PKCE 是否取代了所有控制?
否。 它保护了预期流程中的代码交换;令牌验证、重定向、业务授权和会话仍然需要检查。
JWT 是一种权限吗?
JWT 是一种格式。 声明只有在验证并应用 API 规则后才能使用。
是否应该从头开始构建验证?
建议使用维护良好的库和提供商文档,然后测试配置。 即使是正确的库也可能配置错误。
官方参考文献
参考文献支持该方法。 请根据您的实际情况调整检查;它们并非认证。 原始参考文献标题和源文档可能使用其他语言。






