feat(auth): 微信扫码登录后端 —— 网页授权 + ticket 轮询
服务号「植趣 ZeeQ」已认证,走网页授权(snsapi_base,只拿 openid、用户无感), 不接管消息推送,副作用最小。 流程:PC 建 ticket → 二维码指向 /wx/mp?t= → 用户微信扫码 → 302 到微信授权页 → 回调 /api/v1/wx/mp/callback 用 code 换 openid → 找/建用户 → ticket 置 authorized → PC 轮询 /wx/mp/poll 拿到 authorized → 签发 JWT。ticket 一次性消费防重放。 - 配置(appid/secret/base_url)后台可改,secret AES 加密入库,与微信支付同一套 secrets; - ticket 存 Redis(短 TTL),无 Redis 时回退进程内内存(本地单实例可用,生产必须有 Redis); - User 加 wechat_openid。**部分唯一索引**(WHERE openid <> '')而非普通唯一: 存量邮箱用户该列是空串,普通唯一索引会让多个空串互撞、AutoMigrate 直接失败 —— 与之前 NULL 余额同类的坑,这次提前避开。 单测覆盖:授权 URL 拼接(含 #wechat_redirect 锚点必须在末尾)、secret 加密往返、 建号/查号、空 openid 不误命中存量用户。微信 API 调用依赖公网回调,本地测不了, 留待部署后真机扫码。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -24,8 +24,8 @@ type KB struct {
|
||||
Kind string `gorm:"size:16"` // folder / project / case / general
|
||||
}
|
||||
|
||||
func (KB) TableName() string { return "sundynix_kb" }
|
||||
func (KB) isTenantScoped() {}
|
||||
func (KB) TableName() string { return "sundynix_kb" }
|
||||
func (KB) isTenantScoped() {}
|
||||
|
||||
// ListKB 列出某工作区的全部知识库(按创建时间;tenant 插件仍按 ctx 租户过滤)。
|
||||
func (p *Postgres) ListKB(ctx context.Context, spaceID string) ([]KB, error) {
|
||||
@@ -153,11 +153,11 @@ type DocLink struct {
|
||||
BaseModel
|
||||
TenantID string `gorm:"size:64;index"` // 多租户作用域(ReplaceDocLinks 按 space 的租户补)
|
||||
SpaceID string `gorm:"size:64;index:idx_link_sf"`
|
||||
Owner string `gorm:"size:64;index"` // 创建人(归属)
|
||||
KB string `gorm:"size:64;index:idx_link_sf"`
|
||||
FromID string `gorm:"size:24;index:idx_link_sf"` // 源文档 Doc.ID
|
||||
ToID string `gorm:"size:24;index"` // 目标文档 Doc.ID(空=悬空:目标尚未入库)
|
||||
ToName string `gorm:"size:160"` // [[原始名]],供悬空链接展示 / 目标入库后回填 ToID
|
||||
Owner string `gorm:"size:64;index"` // 创建人(归属)
|
||||
KB string `gorm:"size:64;index:idx_link_sf"`
|
||||
FromID string `gorm:"size:24;index:idx_link_sf"` // 源文档 Doc.ID
|
||||
ToID string `gorm:"size:24;index"` // 目标文档 Doc.ID(空=悬空:目标尚未入库)
|
||||
ToName string `gorm:"size:160"` // [[原始名]],供悬空链接展示 / 目标入库后回填 ToID
|
||||
}
|
||||
|
||||
func (DocLink) TableName() string { return "sundynix_doc_link" }
|
||||
|
||||
Reference in New Issue
Block a user