Skip to content

fix: 邮件 token 改用 UUID,避免 base32 填充被邮件链路破坏#523

Merged
yokowu merged 1 commit intochaitin:mainfrom
LydiaCai1203:fix-bind-email-token
Apr 17, 2026
Merged

fix: 邮件 token 改用 UUID,避免 base32 填充被邮件链路破坏#523
yokowu merged 1 commit intochaitin:mainfrom
LydiaCai1203:fix-bind-email-token

Conversation

@LydiaCai1203
Copy link
Copy Markdown
Contributor

问题:
邮箱绑定 / 重置密码 token 由 crypto.Simple 生成,为 base32 编码
且必然以 6 个 = 填充结尾。邮件经过 MTA、quoted-printable
归一化或链接重写器时,末尾 = 会被吃掉,导致 base32 解码在
byte 82 报错 "illegal base32 data at input byte 82",用户无法
完成邮箱绑定(100% 复现)。

方案:
将 token 改为 uuid.NewString():字符集仅 [0-9a-f-],URL 安全,
长度 36,没有 padding;熵 122 bit 反而高于原 5 字节随机。过期
由 Redis TTL 控制。

改动:

  • biz/user/usecase/user.go SendBindEmailVerification / VerifyBindEmail: Redis key 由 bind_email_token:{userID} 改为 bind_email_token:{token}, value 由 {token}:{email} 改为 {userID}:{email}, 去掉 ValidateSimple 及冗余的 storedToken 比对。
  • biz/team/usecase/user.go generateResetPWDToken 内部改为 uuid.NewString(),签名保持不变 以最小化调用方改动(verify 侧 auth.go 无需修改)。

注意:
语义变化——原实现 key 为 {userID},同用户多次请求只有最新 token
有效;新实现下多次请求的 token 并存有效(均受 24h TTL 控制)。

问题:
  邮箱绑定 / 重置密码 token 由 crypto.Simple 生成,为 base32 编码
  且必然以 6 个 `=` 填充结尾。邮件经过 MTA、quoted-printable
  归一化或链接重写器时,末尾 `=` 会被吃掉,导致 base32 解码在
  byte 82 报错 "illegal base32 data at input byte 82",用户无法
  完成邮箱绑定(100% 复现)。

方案:
  将 token 改为 uuid.NewString():字符集仅 [0-9a-f-],URL 安全,
  长度 36,没有 padding;熵 122 bit 反而高于原 5 字节随机。过期
  由 Redis TTL 控制。

改动:
  - biz/user/usecase/user.go
    SendBindEmailVerification / VerifyBindEmail:
    Redis key 由 bind_email_token:{userID} 改为 bind_email_token:{token},
    value 由 {token}:{email} 改为 {userID}:{email},
    去掉 ValidateSimple 及冗余的 storedToken 比对。
  - biz/team/usecase/user.go
    generateResetPWDToken 内部改为 uuid.NewString(),签名保持不变
    以最小化调用方改动(verify 侧 auth.go 无需修改)。

注意:
  语义变化——原实现 key 为 {userID},同用户多次请求只有最新 token
  有效;新实现下多次请求的 token 并存有效(均受 24h TTL 控制)。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@yokowu yokowu merged commit 9e0b43b into chaitin:main Apr 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants