如何选择授权方式
本页帮你根据“谁在调用、有没有用户、有没有浏览器”选出合适的授权流程,并标出每种流程在 wicket v0.1.4 中的实际支持程度。支持程度来自源码核对与实际运行,而不是发现文档的声明——两者在几处并不一致。
决策表
| 场景 | 典型例子 | 推荐流程 | SetAllowedGrantTypes | v0.1.4 状态 |
|---|---|---|---|---|
| 机器对机器,没有用户 | 定时任务、内部微服务互调 | 客户端凭据 | wicket.GrantTypesClientCredentials | 可用,已端到端验证 |
| Web 服务端应用,有用户 | 传统 Web 后台、BFF | 授权码 + PKCE(机密客户端) | wicket.GrantTypesCode | 可用;宿主需提供登录页与登录 Cookie 处理器 |
| SPA / 移动端,有用户 | 单页应用、iOS / Android App | 授权码 + PKCE(公共客户端,RequireClientSecret = false) | wicket.GrantTypesCode | 可用,同上 |
| 长期保持登录 | 上述有用户的场景 | 叠加 刷新令牌(offline_access) | 客户端设 AllowOfflineAccess | 可签发与使用,但 v0.1.4 尚未实现过期与轮换策略,需宿主补防护 |
| 无浏览器或输入不便的设备 | 电视、命令行工具、IoT | 设备授权 | wicket.GrantTypesDeviceFlow | 不可用于生产:无内置设备授权端点,签发的令牌缺少作用域 |
| 后端发起、用户在另一台设备上确认 | 柜台办理、呼叫中心核身 | CIBA(仅 poll) | wicket.GrantTypesBackchannelAuthentication | 可用;必须替换默认用户校验器,用户确认由宿主实现 |
| 用户登出 | 所有有用户的场景 | 会话与登出 | — | /connect/endsession 可用;前/后通道通知与 checksession 不生效 |
快速判断
- 令牌代表谁? 只代表服务自己 → 客户端凭据。代表某个用户 → 继续往下。
- 用户此刻能在发起方的浏览器里操作吗? 能 → 授权码 + PKCE。不能 → 继续往下。
- 用户在另一台设备上确认,发起方是你的后端? 是 → CIBA。是一台没有浏览器的终端 → 设备授权(v0.1.4 中请改用 设备授权 页列出的替代方案)。
不推荐或默认关闭的方式
| 方式 | 说明 |
|---|---|
隐式流(response_type=token / id_token) | 代码仍支持,但令牌经由浏览器地址传递,新应用请用授权码 + PKCE。SetAllowedGrantTypes 不允许把 implicit 与 authorization_code 组合在一起 |
资源所有者密码(password) | 默认拒绝:未注入校验器时使用的是“不支持”的占位实现,发现文档的 grant_types_supported 中也不出现。确需兼容旧系统时通过 cfg.SetResourceOwnerValidator 注入 |
混合流(code id_token 等) | 代码仍支持,新应用没有使用理由 |
发现文档与实际实现的差异
客户端库通常依据 /.well-known/openid-configuration 自动配置。v0.1.4 的发现文档中有几项声明与实际不符,接入时请以本站各流程页为准:
| 发现文档字段 | 声明 | 实际 |
|---|---|---|
device_authorization_endpoint | /connect/deviceauthorization | 未注册,请求会落到宿主 handler |
revocation_endpoint | /connect/revocation | 未注册,请求会落到宿主 handler |
frontchannel_logout_supported / backchannel_logout_supported | true | 均不会实际发出通知 |
check_session_iframe | /connect/checksession | 页面存在,但授权响应不返回 session_state |
完整字段说明见 发现文档。
所有流程共通的约定
- 令牌端点
POST /connect/token只接受表单编码;客户端认证支持client_secret_basic与client_secret_post。 - v0.1.4 的令牌端点错误统一返回 HTTP 400(包括
invalid_client),响应体是 JSON,带error、error_description和一个custom字段。 - 成功响应总是包含
id_token、refresh_token两个键,未签发时值为空字符串。