身份接入概览
本页回答一个问题:用户的身份来自第三方(Google、Apple、微信、运营商号码认证……)时,wicket 里该用哪一块能力。
wicket 在这方面提供两类彼此独立的能力,它们解决的问题、依赖和接入方式都不同:
| (a) 授权服务器的外部登录 | (b) 无状态令牌验证包 | |
|---|---|---|
| 代表 | auth/google、auth/facebook、auth/jwt、dynamicscheme | oidcverify、wechatverify、phoneverify |
| 运行位置 | 挂在 wicket 中间件管线里,是认证方案(scheme)的 handler | 普通 Go 包,业务代码直接调用 |
| 交互形态 | 浏览器重定向、回调路径、cookie | 一次函数调用:输入凭据串,输出身份或错误 |
| 依赖 | di.Root、ServerConfig、宿主提供的 cookie handler | 不依赖任何 store、不依赖 DI 容器,可单独 import |
| 结果去向 | 登录进 wicket 的会话,之后由授权端点签发 wicket 自己的令牌 | 交给你的业务代码自行决定:查库、建号、签发自己的会话 |
(a) 作为授权服务器时接入外部登录
wicket 作为 OpenID Connect / OAuth 2.0 授权服务器运行时,/connect/authorize 需要一个“已登录用户”。这个用户可以来自你自己的登录页,也可以来自外部身份提供者:
- Google / Facebook:标准的 OAuth 2.0 授权码往返。wicket 内置两个 handler,负责构造跳转 URL、在回调路径(
/signin-google、/signin-facebook)换取令牌、拉取用户信息并映射为 claims。见 外部登录。 - JWT Bearer:不是登录流程,而是让宿主的 API 接受外部签发的 JWT 访问令牌。见 JWT Bearer 认证。
- 动态认证方案:在运行期增删认证方案记录。v0.1.4 中这一子系统只提供了存储与解析层,且通过容器无法启用,详见 动态认证方案 中的现状说明。
外部登录需要宿主补齐 cookie handler
v0.1.4 没有内置可用的 cookie 认证 handler:默认方案 wicket 与外部方案 wicket.external 在容器中注册的是一个“不支持”的占位 handler。外部登录回调成功后要把用户签入某个 cookie 方案,这一步必须由宿主通过 ServerConfig.SetAuthenticationHandlerProvider 提供实现。详见 外部登录。
(b) 无状态令牌验证包
这三个包面向“移动端/前端已经从厂商拿到了凭据,后端只需确认它是真的、并取出身份”的场景。它们不参与授权码流,没有 handler、没有 cookie、没有重定向,也不读写任何 store:
oidcverify:用 JWKS 公钥在本地验证 Apple、Google 或任意标准 OIDC 提供者签发的 ID Token(仅 RS256)。wechatverify:把微信移动应用登录拿到的授权 code 交给微信服务端,换取 unionid / openid。phoneverify:把阿里云号码认证(一键登录)SDK 拿到的 token 交给阿里云服务端,换取手机号。
前一个是本地验签,后两个是服务端交换,两者在出网、延迟、机密保管、故障语义上差别很大,选型前建议先读 本地验签与服务端交换。
容器里分别为三个包注册了一个空的配置指针(*oidcverify.ProviderConfig、*wechatverify.Config、*phoneverify.PhoneAuthConfig),但不注册验证器本身——空配置构造必然失败。最简单的用法是完全绕开容器,在你自己的初始化代码里直接调用各包的 NewVerifier。
我该用哪个
| 你手里的东西 / 你的目标 | 选用 |
|---|---|
| 浏览器用户要“用 Google 账号登录”你的授权服务器,然后由 wicket 给下游应用签发令牌 | auth/google(外部登录) |
| 同上,但身份来源是 Facebook | auth/facebook(外部登录) |
| 你的 HTTP API 要接受另一个签发方(也可能就是 wicket 自己)发出的 JWT 访问令牌 | auth/jwt(JWT Bearer 认证) |
App 端完成了“通过 Apple 登录”,把 identityToken 发给后端 | oidcverify.AppleConfig(oidcverify) |
| Android / iOS 端用 Google 登录 SDK 拿到 ID Token,发给后端 | oidcverify.GoogleConfig(oidcverify) |
| 任意标准 OIDC 提供者签发的 ID Token(RS256 + JWKS) | oidcverify.ProviderConfig(oidcverify) |
App 端完成微信登录,拿到授权 code | wechatverify(wechatverify) |
| App 端完成运营商一键登录,拿到号码认证 token | phoneverify(phoneverify) |
| 想在运行期由管理后台增删登录方式 | 目前无可用的端到端方案,见 动态认证方案 |
两类能力可以叠加
常见组合是:App 端用 oidcverify / wechatverify / phoneverify 在后端确认身份,再由你的代码把该身份映射到本地用户;之后若要为第三方应用签发标准令牌,再走 wicket 的授权流程(例如 CIBA 或授权码)。验证包只负责“确认身份”,不负责“签发令牌”。