配置选项
wicket 的协议行为由一个 *options.WicketOptions 对象控制(包 github.com/gonewx/wicket/config/options)。本页列出常用字段与 v0.1.4 源码中的真实默认值,并标出哪些字段当前没有被读取。
如何修改选项
WicketOptions 在 di.NewRoot() 中以单例创建。宿主从容器取出同一个指针,直接改字段即可:
// 示意:app 为宿主自己的 http.Handler
root, err := di.NewRoot()
if err != nil {
log.Fatal(err)
}
defer root.Close()
opts := godi.GetRequired[*options.WicketOptions](root)
opts.IssuerUri = "https://id.example.com"
opts.UserInteraction.LoginUrl = "/account/login"
opts.UserInteraction.LoginReturnUrlParameter = "returnUrl"
cacheSeconds := 3600
opts.Discovery.ResponseCacheInterval = &cacheSeconds
cfg := root.ServerConfig()
// ... 注入 ...
cfg.Freeze()
srv, _ := server.DefaultServer(root)
handler := hosting.ScopeMiddleware(root)(srv.UseWicket()(app))规则:
- 在
NewRoot()之后、UseWicket()之前完成全部修改。UseWicket()会立即校验部分字段(见 嵌入宿主应用)。 - 不要在服务运行中修改。 选项对象没有并发保护,请求处理期间读取字段。
- 绝大多数字段在请求处理时读取,改了就生效。例外是在
NewRoot()内就被拷贝进单例的字段,之后修改无效:
NewRoot 时即被读取的选项
KeyManagement.*:密钥管理器在NewRoot()中构造并拷贝配置。v0.1.4 实测:之后设置opts.KeyManagement.Enabled = true,管理器仍为禁用状态。开启自动密钥管理的可行做法见 签名密钥。DynamicProviders.Enabled/StorageProvider/CacheTTL/Clock:动态方案解析器同样在NewRoot()中构造。
顶层字段
| 字段 | 默认值 | 说明 |
|---|---|---|
IssuerUri | "" | 签发者。空时按请求的 Host 与是否 TLS 推导;生产必须设置 |
AccessTokenJwtType | "at+jwt" | JWT 访问令牌头部的 typ |
EmitScopesAsSpaceDelimitedStringInJwt | false | false 时 JWT 中的 scope 是数组;true 时是空格分隔字符串 |
EmitIssuerIdentificationResponseParameter | true | 授权响应是否携带 iss 参数。注意发现文档中的 authorization_response_iss_parameter_supported 始终为 true,不随此开关变化 |
EmitStateHash | false | 身份令牌中加入 s_hash |
StrictJarValidation | false | 对 JWT 请求对象(JAR)做严格的 typ 校验 |
LowerCaseIssuerUri、EmitStaticAudienceClaim、ValidateTenantOnAuthorization | — | v0.1.4 未被读取,设置无效果 |
Endpoints:端点开关
opts.Endpoints 下的开关全部默认 true(EnableJwtRequestUri 除外,默认 false)。但它们在 v0.1.4 中的作用并不一致,分两类:
处理器会检查开关,关闭后返回 404:
| 字段 | 影响 |
|---|---|
EnableDiscoveryEndpoint | 发现文档与 JWKS 两个端点 |
EnableUserInfoEndpoint | UserInfo |
EnableEndSessionEndpoint | 结束会话及其回调 |
EnableCheckSessionEndpoint | 会话检查 iframe |
只影响发现文档是否公布该端点,端点本身仍然工作:
EnableAuthorizeEndpoint、EnableTokenEndpoint、EnableIntrospectionEndpoint、EnableBackchannelAuthenticationEndpoint。例如实测将 EnableTokenEndpoint 设为 false 后,发现文档不再包含 token_endpoint,但 /connect/token 仍正常处理请求。如需真正屏蔽,请在 wicket 外层用宿主中间件拦截该路径。
对应端点未实现,只影响发现文档:
EnableTokenRevocationEndpoint、EnableDeviceAuthorizationEndpoint。v0.1.4 没有注册吊销与设备授权处理器,但默认开关为 true,发现文档会公布 revocation_endpoint 与 device_authorization_endpoint,请求实际落到宿主 handler。如果你不打算自己实现这两个端点,建议关闭它们,避免客户端误用:
opts.Endpoints.EnableTokenRevocationEndpoint = false
opts.Endpoints.EnableDeviceAuthorizationEndpoint = falseEnableJwtRequestUri 控制是否允许授权请求使用 request_uri 远程拉取请求对象。
Discovery:发现文档
| 字段 | 默认值 |
|---|---|
ShowEndpoints、ShowKeySet、ShowIdentityScopes、ShowApiScopes、ShowClaims、ShowResponseTypes、ShowResponseModes、ShowGrantTypes、ShowExtensionGrantTypes、ShowTokenEndpointAuthenticationMethods | 全部 true |
ExpandRelativePathsInCustomEntries | true(CustomEntries 中以 ~/ 开头的值展开为绝对 URL) |
ResponseCacheInterval | nil:不设缓存头;设为非负整数 N 时,发现文档与 JWKS 响应带 Cache-Control: max-age=N 和 Vary: Origin |
CustomEntries | 空 map,可加入自定义字段 |
注意 ShowKeySet = false 时 JWKS 端点也会返回 404。
UserInteraction:交互页面
登录、同意、错误页面由宿主实现,wicket 只负责重定向。LoginUrl 与 LoginReturnUrlParameter 默认为空,需宿主设置。完整默认值表见 嵌入宿主应用 的“登录、同意与错误页面由宿主实现”一节。
Authentication:认证与会话 cookie
| 字段 | 默认值 | 说明 |
|---|---|---|
CookieAuthenticationScheme | "" | 交互用户的 cookie 方案;空时取认证选项的默认方案 |
CookieLifetime | 10h | 写入 wicket cookie 方案选项的 ExpireTimeSpan;wicket 自身不消费,由宿主提供的 cookie handler 读取 |
CookieSlidingExpiration | false | 同上,写入 SlidingExpiration |
CookieSameSiteMode | 零值(未设置) | |
CheckSessionCookieName | "wicket.session" | 不能为空,UseWicket() 会校验 |
CheckSessionCookieSameSiteMode | http.SameSiteNoneMode | |
RequireAuthenticatedUserForSignOutMessage | false | |
RequireCspFrameSrcForSignout | true | |
CoordinateClientLifetimesWithUserSession | false | v0.1.4 未被读取 |
InputLengthRestrictions:输入长度上限
请求参数超过上限会被拒绝。默认值:大多数字段为 100;Scope、Nonce、AcrValues 为 300;RedirectUri 为 400;CspReport 为 2000;IdTokenHint、LoginHintToken 为 4000;Jwt 为 51200;ResourceGapMaxLength 为 512;PKCE 的 CodeChallenge* / CodeVerifier* 长度范围为 43–128。
如果你的客户端 ID 或密钥较长(例如超过 100 个字符),需要相应调大 ClientId / ClientSecret。
Cors 与 Csp
Cors:CorsPolicyName默认"wicket"(不能为空),CorsPaths默认为发现、JWKS、令牌、UserInfo、吊销五个路径。v0.1.4 没有任何代码输出Access-Control-*响应头,CorsPaths、PreflightCacheDuration与客户端的AllowedCorsOrigins本身不产生 CORS 行为,只能作为宿主中间件的判定数据。浏览器端直接调用令牌端点的场景需要宿主自行处理 CORS,见 CORS 跨域。Csp:Level默认CspLevelTwo,AddDeprecatedHeader默认true。用于 wicket 自己输出的 HTML 响应(form_post授权响应、会话检查 iframe、前端通道登出页)的 CSP 头。
其他子选项
| 选项 | 默认值与说明 |
|---|---|
Validation.InvalidRedirectUriPrefixes | javascript:、file:、data:、mailto:、ftp:、blob:、about:、ssh:、tel:、view-source:、ws:、wss:——这些前缀不能作为自定义 scheme 的回跳地址 |
BackchannelAuthentication | AllowedDeliveryModes 为 ["poll"],DefaultRequestLifetime 300 秒,DefaultPollingInterval 5 秒,SlowDownIntervalIncrement 5 秒,UserCodeParameterSupported 为 true。其中 Enabled 字段 v0.1.4 未被读取 |
DeviceFlow | 是值类型且未初始化:Interval 为 0、DefaultUserCodeType 为空。使用设备码授权时请显式设置(例如 Interval = 5) |
ServerSideSessions | Enabled 为 false;SessionLifetime 14 天;CookieName "wicket.session";CookieSecure true;CookieSameSite None |
PersistentGrants.DataProtectData | true,但 v0.1.4 中不生效:持久化授权数据不做保护,见 生产部署清单 |
MutualTls | Enabled 为 false;v0.1.4 未注册 mTLS 端点 |
KeyManagement | Enabled 为 false,AllowedAlgorithms 为 ["RS256"],DefaultAlgorithm 为 "RS256";见 签名密钥 |
DynamicProviders | Enabled 为 false;见 动态认证方案 |